Сохранение курсора указывает с экземпляром действия?

У меня есть приложение для Android, которое вытягивает случайные 20 вопросы (строки) как курсор от DB SQLite и циклов через все вопросы спросить пользователя все 20 вопросов.

Там некоторый путь состоит в том, чтобы сохранить состояние/местоположение курсора, когда действие приостанавливается или останавливается так, чтобы, когда действие возобновляется, курсор был восстановлен и в том же положении, как это было, когда действие было приостановлено/остановлено?

Если Вам нужен я для регистрации моего кода, просто спрашивают.

Спасибо за внимание!

1
задан Ryan 27 April 2010 в 20:07
поделиться

1 ответ

Заставить ее сохранить то положение, в котором она находилась, очень просто, просто введите некоторый код в методе onPause, например:

protected void onPause(){
 position = yourCursor.getPosition();
 super.onPause();
}

где позиция - это поле класса (т.е. объявлено вне любого метода, обычно вверху). Затем в onResume вы можете просто переместить курсор обратно в эту позицию. Если вы не знакомы с onPause () / onResume (), прочитайте жизненный цикл активности . Однако я подозреваю, что вы хотите сохранить, какие вопросы были выбраны случайным образом. Я не думаю, что ваш курсор будет оставаться в onPause / onResume, поскольку они обычно закрыты в onPause, чтобы избежать проблем с памятью. Единственное, что я могу придумать, но я не эксперт, это то, что вам нужно будет сохранить идентификаторы строк вопросов, а затем запросить базу данных для получения этих строк. Насколько неуклюже это решение, зависит в первую очередь от того, как вы запрашиваете случайные вопросы. Если вы уже генерируете 20 случайных чисел, а затем вводите их в свой запрос, вы можете просто повторно использовать тот же метод, но с 20 сохраненными строками.


Это было слишком длинным, чтобы уместиться в качестве комментария:

@Ryan: Действительно, сохранение позиции без состояния курсора довольно бесполезно, если вы не можете воссоздать идентичный курсор - это то, что я говорил во второй половине моего ответа.Я предполагаю, что ваша RANDOM () - это стандартная функция SQL? (Кстати, каков синтаксис для этого в Android? Мне не удалось заставить мою базу данных принять его.) Если да, то вам, возможно, придется применить метод грубой силы, чтобы воссоздать курсор. Под этим я подразумеваю запрос базы данных с помощью «rowId =? OR rowId =? OR rowId =? OR ....» с аргументами выбора, которые являются идентификаторами строк, которые вы извлекли из исходного курсора. Это некрасиво, и, вероятно, есть способ сделать это лучше, но это сработает. Построение строки SELECT было бы легко с помощью такого цикла:

String selectQuery = "";
String[] selectArgs = new String[savedRows.length];
for (int i = 0; i < savedRows.length; i++){
    selectQuery = selectQuery.concat("rowID = ? OR ");
    selectArgs[i] = Long.toString(savedRows[i]);
}

//Remove the last " OR " you'd have in the string
int index = selectQuery.lastIndexOf(" OR ");
selectQuery = selectQuery.substring(0, index);

Предполагается, что вы сохраняете свои rowIds из исходного курсора в long [] savedRows в методе onPause. Затем вы можете передать их в новый запрос к базе данных.


Опять же, слишком долго для комментариев:

@Ryan: Хороший аргумент, возможно, их не отзовут в том же порядке. Вы можете поэкспериментировать, чтобы увидеть, но было бы трудно сказать, было ли это случайностью или намеренно, что они всегда возвращались в одном и том же порядке. Итак, идея номер 3 - это создание промежуточной таблицы, которая заполняется 20 случайными вопросами. В этой таблице будет столбец для номера строки (с указанием порядка вопросов), а затем столбец внешнего ключа с rowId вопроса в таблице вопросов. Получить вопросы в том же порядке из этой таблицы было бы легко, и вы могли бы отбросить таблицу, как только пользователь закончит все вопросы. Или вы даже можете сохранить таблицу, чтобы пользователь мог видеть, насколько хорошо он справился с прошлыми наборами вопросов - но это совершенно другая функция.

Примечание: я должен был упомянуть onSaveInstanceState в моем первом посте.onPause - хорошее место для быстрого сохранения перед сменой действий, но простое сохранение позиции в int не является надежным. Очевидно, он сбрасывается, когда пользователь запускает новую викторину (как и должно), но он также сбрасывается, если, когда пользователь просматривал другое действие, ОС пришлось убить ваш процесс для памяти. В этом случае, когда пользователь возвращается к действию, он должен перезапустить onCreate, и, таким образом, он теряет данные переменных. Это предназначено для работы с методом onSaveInstanceState (), который предоставляет вам Bundle, в котором вы можете сохранять свои данные. Этот же пакет затем предоставляется в onCreate, что позволяет вам перезагружать все, что необходимо, и сделать так, чтобы приложение выглядело так, как будто приложение никогда не было убито.

2
ответ дан 3 September 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: