【问题标题】:"optimize" command in sqlite fts3 on android makes "MATCH" doesn't workandroid上sqlite fts3中的“优化”命令使“匹配”不起作用
【发布时间】:2017-08-03 10:13:43
【问题描述】:

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

        }
}

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

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

将给出一个空光标

【问题讨论】:

    标签: android-sqlite fts4


    【解决方案1】:

    经过大量尝试发现错误(事务、fts 无内容表和预编译 SQL) 问题实际上是使用 execsql,而是使用 rawQuery 解决了问题 我没有在 android execsql 文档中找到这种行为 看到这个question for discussion about using execsql to insert

    所以工作代码是

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多