Промывка и база данных SQLite на андроид - PullRequest
9 голосов
/ 13 июля 2010

У меня есть приложение для Android, использующее базу данных SQLite.Я открываю базу данных при запуске приложения, но никогда не закрываю ее, поскольку она постоянно используется.

Каков наилучший способ заставить базу данных сбросить все свои изменения в постоянное хранилище?Нужно ли просто закрыть его и снова открыть или есть более эффективный способ?

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

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

Ответы [ 3 ]

9 голосов
/ 13 июля 2010

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

Не делай этого. Вы, очевидно, игнорируете все ошибки, которые появляются в LogCat, жалуясь на утечку соединений с базой данных.

Какой лучший способ рассказать база данных, чтобы сбросить все свои изменения в постоянное хранение?

Это будет сделано автоматически в конце транзакции . По умолчанию каждая отдельная операция SQL (например, вставка) является транзакцией.

Нужно ли просто закрыть его и снова открыть или есть более эффективный способ?

Вы должны закрыть свою базу данных в какой-то момент (например, onDestroy() службы, которая является посредником вашей базы данных).

Моя проблема в том, что при тестировании на телефон, выключив телефон после количество записей иногда вызывает базы данных потерять самые последние обновляется, когда приложение перезапущен, что, очевидно, неприемлемо для системы баз данных.

Если вы можете создать пример проекта, который демонстрирует проблему даже после того, как вы правильно закроете соединение с базой данных, опубликуйте его на Android tracker .

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

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

Или откройте новое соединение в каждом компоненте, которому требуется доступ к базе данных, и используйте синхронизацию Java, чтобы два потока не пытались одновременно использовать базу данных (при необходимости).

2 голосов
/ 23 июля 2011

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

db.beginTransaction();
   try {
     ...
     db.setTransactionSuccessful();
   } finally {
     db.endTransaction();
   }
0 голосов
/ 13 июля 2010

Это на дроиде? А как именно ты выключаешь телефон? Если вы не вытащите батарею, выключение телефона будет медленно приводить к завершению работы операционной системы, после чего все данные будут сохраняться в памяти.

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

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