Android数据库rawQuery:奇怪的Cursor行为

时间:2016-10-21 08:10:05

标签: android database sqlite cursor

我需要在升级之前检查数据库中的表。

我在我自己的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();
        }
    }
}

2 个答案:

答案 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。然后完全重建。

我不知道为什么但是...现在查询在主模块或库模块中工作!