【发布时间】:2017-03-03 11:02:00
【问题描述】:
升级前我需要检查数据库中的表。
我在自己的 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();
}
}
}
【问题讨论】:
-
我认为你应该使用 cursor.moveToFirst();首先
标签: android database sqlite cursor