【问题标题】:SQLiteDatabase Cursor empty only on Android 5.0+ devicesSQLiteDatabase 光标仅在 Android 5.0+ 设备上为空
【发布时间】: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 ?) 

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
        <<<<<

【问题讨论】:

  • 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


【解决方案1】:

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

MATCH '*foo*' 查询从未在任何版本的 sqlite 中正确工作过。您之前获得一些结果的事实只是一个巧合。只是MATCH 'foo*'(和MATCH 'foo')的前缀形式是supported

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

【讨论】:

    【解决方案2】:

    您是否尝试过使用如下 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);
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 2011-11-05
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多