我需要在升级之前检查数据库中的表。
我在我自己的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();
}
}
}
答案 0 :(得分:0)
我刚刚重建了你的案例,并找到了" sqlite"保留供内部使用,以下是我收到的ERROR消息。
android.database.sqlite.SQLiteException:保留供内部使用的对象名:sqlite_master
也许你可以尝试另一个表名,看看它是否可行。
答案 1 :(得分:0)
我发布的代码是在库模块中。 当我在主app模块中移动它时,sqlite_master上的查询工作了!
我将build.gradle中的 buildToolsVersion 从24.0.2升级到app模块和库模块中的24.0.3。然后完全重建。
我不知道为什么但是...现在查询在主模块或库模块中工作!