Мое приложение содержит 3000 экзаменационных вопросов в файле .sqlite. И эти вопросы выбираются динамически и сортируются по требованию пользователя (например, «сортировка по количеству неправильных ответов», «только выбор вопросов без доступа»).
Всякий раз, когда пользователь делает выбор, приложение делает соответствующий оператор SQL и, используя sqlite3, все наборы результатов отправляются в NSMutableArray (класс Question). Но, как вы заметите, это трудоемкий процесс (около 2 ~ 3 секунд, и пользовательский интерфейс перестает отвечать при этом).
Итак, я хочу создать класс «курсора», который имеет методы rowCount () и moveToRow (int index).
С этим моя идея
Cursor c = [[Cursor alloc] init] query(
"SELECT id,qtext,answer,a1,a2,... FROM TABLE WHERE id > 100"
)];
// at this time, just a cursor is given, no need to iterate all the retrieved rows
for (i=0; i > c.rowCount(); i++) {
c.moveToRow(i);
ShowQuestionDetail(c);
}
Вот так.
Я знаю, что CoreData подходит для этой цели, но мне нужно поделиться файлом .sqlite с версией этого приложения для Android. CoreData требует, чтобы все имена таблиц и полей начинались с префикса Z_, но я не могу изменить схемы файла .sqlite. Также мне нужно использовать sqlcipher, а CoreData не работает с sqlcipher.
FMDB не поддерживает методы, которые дают счетчик найденных строк и перемещаются к определенной строке.
Существуют ли другие библиотеки-оболочки SQLite, поддерживающие эту функцию?
Кто-то предлагает создать массив 'catalog', который содержит только идентификатор найденных строк и извлекать строку каждый раз, когда вызывается метод moveToRow (). Я согласен, что это хорошая альтернатива, но я хочу найти другой путь.