我在使用 sqlite 和 fts3 时遇到了不正确的 rowid 值。
基本上,前两行被插入,rowId 分别为 1 和 2。然而,第三个插入返回 4 而不是 3。
插入行时,我在 contentprovider 中删除了以下日志消息:
SQLiteDatabase database =
databaseHelper.getWritableDatabase();
long rowId = database.insert(NOTES_TABLE, Note.NOTE, values);
Log.d("NoteProvider", "RowId inserted was " + rowId);
该日志消息的输出是:
02-21 21:10:12.773: DEBUG/NoteProvider(2486): RowId inserted was 1
02-21 21:10:20.623: DEBUG/NoteProvider(2486): RowId inserted was 2
02-21 21:10:25.883: DEBUG/NoteProvider(2486): RowId inserted was 4
那么3怎么了?
另外,我导出了 sqlite 数据库,以便可以在 Sqlite 浏览器中查看,内容表显示 1、2 和 3。
所以创建了 3 但返回了 4。
我将测试运行到 10,然后 rowId 是连续的,但仍然相差 1。
数据库创建脚本是:
database.execSQL("CREATE VIRTUAL TABLE " + NOTES_TABLE + "
USING fts3 ("
+ Note.TITLE + ", "
+ Note.NOTE + ", "
+ Note.CREATED_DATE + ", "
+ Note.MODIFIED_DATE + ");");
我假设我做了一些可怕的错误,但无法弄清楚它是什么。谁能帮我吗?
编辑 1:
进行了更多测试,并在 2.3.1 和 2.1 上获得了相同的结果。
虽然在 2.1 中 1、3 时的 ids(跳过 2)
编辑2:
终于想出了一个解决方法。但是我认为这是一个非常严重的错误或其他东西。我最终做的是从表中选择最大 rowid 增加 1,然后将该值设置为插入时的 rowid。它是一个完整的解决方案。一个非常肮脏和廉价的黑客,但这是我唯一能可靠工作的东西。无论如何这里是代码:
SQLiteDatabase database = databaseHelper.getWritableDatabase();
SQLiteStatement statement = database.compileStatement("select ifnull(max(rowid), 0) as rowid from " + NOTES_TABLE);
long maxRowId = statement.simpleQueryForLong();
Log.d("NoteProvider", "Statement returned " + maxRowId);
long rowId = maxRowId + 1;
values.put("rowid", rowId);
database.insert(NOTES_TABLE, null, values);
Log.d("NoteProvider", "RowId inserted was " + rowId);
编辑3:
看起来另一个人曾经/正在遇到这个问题。
Android 全文搜索和 ListAdapter