SQLiteDatabase Cursor仅在Android 5.0+设备上为空

时间:2015-06-05 14:20:54

标签: android android-sqlite android-cursor

应用程序有一个SearchView,它从特定的数据库表中获取建议。在Android 5.0出现之前,所有工作都没有任何错误。

从那时起,当SQLiteQueryBuilder查询数据库以填充Cursor对象时,返回为空游标。不是NULL,而是空的。

在其他平台上,我可以通过Cursor输出DatabaseUtils.dumpCursorToString(cursorObject)的内容,但在Android 5.0+上,该方法报告空对象的输出

  

将光标转储为空   <<<<<

更多:当我从5.0多个设备中提取数据库文件并运行本地SQL查询时,我可以获取所有数据。所以数据库确实有效。查询是最简单的

SELECT rowid AS _id, suggest_text_1, suggest_text_2, rowid AS suggest_intent_data_id 
FROM fts 
WHERE (fts MATCH '*e*') //<-- I pressed "e" on the keyboard

从数据库中选择数据并填充Cursor对象的逻辑非常简单

    SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
    builder.setTables(FTS3_TABLE);
    builder.setProjectionMap(mColumnMap);

    Cursor cursor = builder.query(db,columns, selection, selectionArgs,
                                   null, null, null);

我试过寻找一些弃用的方法,但没有任何运气。

我已经花了3天的时间来调试流程中的每一步,我不知道可能导致此类行为的任何想法。

任何人都有任何想法?

修改

方法buildQuery()

的输出
String query = builder.buildQuery(columns, selection, null, null, null, null);

RESULT:   
SELECT rowid AS _id, suggest_text_1, suggest_text_2, rowid AS suggest_intent_data_id  
FROM fts   
WHERE (fts MATCH ?) 

selectionselectionArgs参数就像这样创建

String selection = FTS3_TABLE + " MATCH ?";
String[] selectionArgs = new String[]{"*" + query + "*"};

RAW查询与builder.query()

查询的结果相同
String query = builder.buildQuery(columns, selection, null, null, null, null);
Cursor temp = db.rawQuery(query, selectionArgs);
String output = DatabaseUtils.dumpCursorToString(temp);

Output: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@295023a7
        <<<<<

2 个答案:

答案 0 :(得分:2)

由laalto回答https://stackoverflow.com/a/30710226/437039

  

TypeError: Cannot set property 'innerHTML' of null 查询在任何版本的sqlite中都没有正确。你之前得到一些结果这一事实只是一个巧合。只有前缀格式MATCH '*foo*'(和MATCH 'foo*')为supported

     

Lollipop ships with a newer version of sqlite。有关sqlite版本之间更改的详细列表,请参阅changelog

答案 1 :(得分:0)

您是否尝试使用SQLiteDatabase查询方法进行查询,如下所示?

String selection = "fts" + " =? AND " +

 String[] selectionArgs = new String [] {
                "*e*"
        };
 String[] projection = new String [] { "rowId", "suggested_text"};
 SQLiteDatabase db = mDbHelper.getReadableDatabase();
 Cursor cursor = db.query("tableName",
                projection,selection, selectionArgs, null, null, null);