0

我在 android 中创建一个 fts4 表,我批量插入大量行,然后按照sqlite 文档中的建议进行优化

我在android中使用以下代码

public void indexFts() {
      SQLiteDatabase db = getWritableDatabase();
      db.execSQL("CREATE VIRTUAL TABLE IF NOT EXISTS pageTextSearch USING  fts4(content=\"\", page)");
 db.beginTransaction();
        try {
            SQLiteStatement populateFTS_Statement = db.compileStatement(INSERT INTO pageTextSearch(docid,page)VALUES (?, ?)); //pre-compiled sql statement


            while (allPagesCursor.moveToNext()) {
                populateFTS_Statement.clearBindings();
                populateFTS_Statement.bindLong(1, allPagesCursor.getLong(0));
                populateFTS_Statement.bindString(2, allPagesCursor.getString(1));
                populateFTS_Statement.executeInsert();

            }
            db.execsql( INSERT INTO pageTextSearch(pageTextSearch)VALUES('optimize'));

            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();

        }
}

现在,当我使用 match 查询 fts 表时,无论查询如何,我都会得到 0 结果:

  db.rawQuery(SELECT docid FROM pageTextSearch WHERE page MATCH ?
                , new String[]{"a"});

将给出一个空光标

4

1 回答 1

0

在尝试了很多发现错误(事务、fts 无内容表和预编译 SQL)之后,问题实际上是使用 execsql,而是使用 rawQuery 解决了问题我没有在 android execsql 文档中找到这种行为记录看到这个关于使用 execsql 插入的讨论问题

所以工作代码是

 db.rawQuery( INSERT INTO pageTextSearch(pageTextSearch)VALUES('optimize'),null);
于 2017-03-13T11:48:08.480 回答