在升级之前,我需要检查数据库中的表。
我在我自己的DatabaseHelper中覆盖SQLiteOpenHelper.onUpgrade(SQLiteDatabase db, int oldVer, int newVer)以在数据库版本增加时执行此项工作。
我在sqlite_master表上使用这个查询来获取表名:select * from sqlite_master,但是即使cursor.getCount()==29(DB不是空的并且包含29个对象),光标也是空的,
同样的查询在我的APP的地方很有用。
我在模拟的Android 4.4(api 19)上测试这个,而我的应用程序是使用内置的
minSdkVersion 12
targetSdkVersion 24有关这种奇怪行为的想法吗?
代码如下:
public class DatabaseHelper extends SQLiteOpenHelper {
public static DatabaseHelper getHelper(Context context) {
if (instance == null)
synchronized( DatabaseHelper.class ) {
if( instance==null )
instance = new DatabaseHelper(context.getApplicationContext());
}
return instance;
}
private DatabaseHelper(Context c) {
super(c, DB_NAME, null, 6 /* version */);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
final boolean inTransaction = db.inTransaction();
if( !inTransaction )
db.beginTransaction();
Cursor cur = null;
try {
// cur = db.query("sqlite_master", null, null, null, null, null, null); // SAME BEHAVIOUR
cur = db.rawQuery("select * from sqlite_master", null );
int count = cur.getCount(); // ASSIGN 29 TO COUNT
while( cur.moveToNext()) {
** NEVER ENTERS HERE **
}
if( !inTransaction )
db.setTransactionSuccessful();
} catch (Exception e) {
log.e(DBTAG, e.getMessage(), e);
} finally {
if( cur!=null)
cur.close();
if( !inTransaction )
db.endTransaction();
}
}
}