我遇到的sidite和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中ids时为1,3(跳过2)
编辑2:
终于想出了一个解决方案。但是我认为这是一个非常严重的错误或其他什么。
我最终做的是从表格中选择最大rowid,然后将该值设置为插入时的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 Full Text Search and ListAdapter
答案 0 :(得分:1)
我也遇到了同样的问题,并提出了类似于你的解决方案:)
但是,由于我使用FTS3的other troubles,我已经完全重新设计了数据库:将非文本列推送到单独的表,将文本字段推送到另一个,并创建查询视图;以及删除触发器。
因此,现在我正在使用旧的Table._ID
:)
答案 1 :(得分:0)
这看起来像是SQLite中的一个错误。原帖的“编辑2”中的解决方案似乎正常工作。没有在Honeycomb中试过来验证它已经在那里修复了。