在android上的sqlite fts3中的“optimize”命令使“MATCH”不起作用

时间:2017-03-13 11:48:08

标签: android-sqlite fts4

我在android中创建一个fts4表,我批量插入大量行,然后根据sqlite documentation

中的建议进行优化

我在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();

        }
}

现在当我用匹配查询fts表时,无论查询是什么,我得到0结果 例如:

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

会给出一个空光标

1 个答案:

答案 0 :(得分:0)

经过多次尝试发现错误(事务,fts无内容表和预编译SQL) 问题实际上是使用execsql,使用rawQuery代替解决了问题 我没有发现android execsql documenationn中记录了这种行为 请参阅此question for discussion about using execsql to insert

所以工作代码是

 db.rawQuery( INSERT INTO pageTextSearch(pageTextSearch)VALUES('optimize'),null);