2010-06-13 5 views
0

This Android application on Google использует следующий метод для обновления базы данных после замены файла базы данных с помощью резервного копирования:Сброс или обновления соединения с базой данных

public void resetDbConnection() { 
    this.cleanup(); 
    this.db = 
     SQLiteDatabase.openDatabase(
      "/data/data/com.totsp.bookworm/databases/bookworm.db", 
      null, SQLiteDatabase.OPEN_READWRITE); 
} 

Я не построил это приложение, и я не уверен, что происходит. Я стараюсь, чтобы эта идея работала в моем собственном приложении, но данные, как представляется, кэшируются представлениями, и приложение продолжает отображать данные из базы данных, которая была заменена, даже после того, как я вызываю cleanup() и повторно открываю базу данных , Я должен завершить и перезапустить активность, чтобы увидеть новые данные.

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

Я закончил перезапуск программы программно, которая работает, но это, по-видимому, является резкой мерой. Есть ли способ лучше?

+0

Возможно, вам придется запрашивать ваши курсоры и/или notifiydataset изменений. – Pentium10

ответ

1

Согласовано с Pentium10, по крайней мере концептуально.

Приложение использует Cursor, чтобы показать свои данные. A Cursor в Android похож на клиентский курсор в ODBC, поскольку он является кешированной копией всех данных, представленных в наборе результатов запроса.

Теперь обычным способом обработки изменений в содержимом базы данных является вызов requery() на Cursor. Это будет пульсировать его изменения через CursorAdapter к прилагаемому ListViews или другому AdapterViews.

В вашем случае я не совсем уверен, что это сработает, поскольку вы закрываете, заменяете и повторно открываете базу данных. Это не должно делаться с открытым Cursor по данным AFAIK. Итак, в вашем случае вам нужно закрыть Cursor, выполнить перетасовку базы данных, а затем снова запустить запрос, чтобы получить новую Cursor в вашей новой базе данных.

+0

Это кажется непрактичным, так как у меня есть TabHost с несколькими вкладками, каждый из которых имеет свой собственный курсор. Я даже не уверен, как я буду уведомлять курсор каждой вкладки, чтобы сделать requery(). Фактически, похоже, что курсоры обновляются, когда обнаруживают изменение. Например, когда я запускаю событие в один из моих списков ListView, что приводит к попытке обновить строку, которая больше не существует в базе данных, курсор обновляется, и ListView показывает правильные данные. Я не говорю, что так я и хочу, чтобы он вел себя, я просто упоминаю это как наблюдение. – cdonner

+0

@cdonner: «На самом деле кажется, что курсоры обновляются, когда они обнаруживают изменение». Если они управляются курсорами, это в высшей степени возможно. По-прежнему маловероятно, что они оценят, что их база данных вырвана из-под них. Возможно, вы можете восстановить свою базу данных только при запуске приложения или в другое время, когда вы знаете, что у вас не будет открытых подключений к базе данных. – CommonsWare

+0

Ждать пользователя, чтобы что-то сделать с данными, а затем показать ему что-то еще, неприемлемо, конечно. Я сохраню свой код, который завершит действие и перезапустит его, так как он гарантирует, что все будет правильно инициализировано. – cdonner

Смежные вопросы