Как и где хранить постоянные объекты (например, адаптеры БД) в AppWidgetProvider?

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

Самой большой проблемой для меня является то, как (и где) хранить экземпляр моего DBAdapter. Если бы я использовал Activity, это было бы очень просто — я создам экземпляр своего DBAdapter в методе onCreate, и все в порядке. Но сейчас у меня нет такой возможности, так как я использую AppWidgetProvider и несколько IntentServices. AppWidgetProvider (BroadcastReceiver) живет только определенное время - во время выполнения метода onReceive. IntentService также "заканчивается" после завершения необходимой работы. Итак, как и где хранить экземпляр моего DBAdapter? Я не хочу каждый раз создавать новый экземпляр DBAdapter.

Я думал об этих вариантах: сделать одноэлементный класс DBAdapter или использовать статический класс и методы, другой вариант - использовать Gson для хранения DBAdapter в общих настройках или, возможно, использовать сериализацию. Но я лучше спрошу. Как правильно это сделать? Большое спасибо


person qkx    schedule 28.05.2012    source источник


Ответы (1)


Самой большой проблемой для меня является то, как (и где) хранить экземпляр моего DBAdapter.

Совет: не заканчивайте классы с Adapter, если они не наследуются от android.widget.Adapter.

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

Вы можете сделать его одноэлементным/статическим элементом данных. Однако, как только ваш процесс завершится, он исчезнет, ​​и вам все равно придется снова создавать новый. Следовательно, я рекомендую вам просто создать экземпляр по мере необходимости в вашем IntentService. DBAdapter "с простыми методами (добавить, удалить, получить записи...)" должен быть чрезвычайно дешевым в реализации.

другой вариант - использовать Gson для хранения DBAdapter в общих настройках или, возможно, использовать сериализацию.

Это бессмысленно. Единственными ценными данными в DBAdapter должны быть SQLiteOpenHelper (или SQLiteDatabase из какого-либо другого источника), которые сами по себе не могут быть сохранены. Более того, это будет примерно в 1000 раз медленнее, чем просто создание нового экземпляра DBAdapter.

person CommonsWare    schedule 28.05.2012
comment
но как это сделать, если мне нужно записать в БД из нескольких сервисов? Например, служба данных работает в фоновом режиме через равные промежутки времени и записывает свежие данные в БД, а на переднем плане я делаю некоторые записи в зависимости от пользователя - если эти записи выполняются одновременно (иногда это происходит), я получаю исключение android.database.sqlite.SQLiteException: error code 5: database is locked. Что теперь? Подробнее здесь: stackoverflow.com/questions/10798233/ - person qkx; 29.05.2012