Я испытываю неверное значение rowid с sqlite и fts3.
В основном, первые две строки вставляются, и rowId равен 1 и 2 соответственно.Третья вставка, однако, возвращает 4 вместо 3.
При вставке строки я сбросил следующее сообщение журнала в моем поставщике контента:
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 (пропущено 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