我在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"});
会给出一个空光标
答案 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);