Неправильный RowId с SQLite с использованием FTS3 на Android 2.2 - PullRequest
2 голосов
/ 22 февраля 2011

Я испытываю неверное значение 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

Ответы [ 2 ]

1 голос
/ 28 февраля 2011

Я тоже столкнулся с той же проблемой и нашел решение, похожее на ваше:)

Однако из-за других проблем У меня были проблемы с FTS3, я полностью переработал базу данных: выдвинул нетекстовые столбцы в отдельную таблицу, текстовые поля в другую и создал представление для запроса; а также триггеры для удаления.

Поэтому сейчас я использую старый добрый Table._ID:)

0 голосов
/ 21 октября 2011

Это похоже на ошибку в SQLite. Решение в "Edit 2" оригинального сообщения, кажется, работает хорошо. Не пробовал его в Honeycomb, чтобы убедиться, что он там исправлен.

...