【发布时间】:2015-06-08 23:40:07
【问题描述】:
应用程序有一个SearchView,它从特定的数据库表中获取建议。在 Android 5.0 出现之前,一切正常,没有任何错误。
此时,当SQLiteQueryBuilder查询数据库填充Cursor对象时,返回的是空游标。不是NULL,而是空的。
在其他平台上,我可以通过DatabaseUtils.dumpCursorToString(cursorObject) 输出Cursor 的内容,但在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 ?)
selection 和 selectionArgs 参数是这样创建的
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
<<<<<
【问题讨论】:
-
buildQuery() 返回什么?
-
我指的是
String buildQuery()方法 -
你的 selection 和 selectionArgs 是什么?
-
您是否尝试在您的设备上使用 sqlite3 应用程序运行该查询?还是您尝试运行 SQLiteDatabase.rawQuery (String sql, String[] selectionArgs) ?
-
如果 db.rawQuery() 产生一个空游标,你就会知道为什么 SQLiteQueryBuilder 产生一个空游标,见androidxref.com/5.1.0_r1/xref/frameworks/base/core/java/android/…
标签: android android-sqlite android-cursor