Сохранение состояния курсора с экземпляром действия? - PullRequest
1 голос
/ 28 апреля 2010

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

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

Если вам нужно, чтобы я опубликовал свой код, просто спросите.

Спасибо за ваше время!

1 Ответ

2 голосов
/ 28 апреля 2010

Получить его, чтобы сохранить положение, в котором он находился, очень просто, просто поместите некоторый код в метод onPause, например, так:

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

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


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

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


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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...