2

我在使用 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

4

2 回答 2

1

我也遇到了同样的问题,并提出了与您类似的解决方案:)

然而,由于我在使用 FTS3 时遇到的其他问题,我完全重新设计了数据库:将非文本列推送到单独的表中,将文本字段推送到另一个表中,并创建查询视图;以及删除触发器。

因此,现在我正在使用旧的Table._ID:)

于 2011-02-27T23:29:28.670 回答
0

这看起来是 SQLite 中的一个错误。原始帖子的“编辑2”中的解决方案似乎工作正常。尚未在 Honeycomb 中尝试过以验证它是否已修复。

于 2011-10-20T22:07:35.797 回答