Intereting Posts
Как объединить аудиофайл с изображением или видеофайлом в Android? Как вытащить строку из пакета в onResume ()? SQLiteOpenHelper – как создается база данных? Android имитирует низкое сетевое подключение Является ли Parse.com подходящей услугой для резервного копирования / синхронизации с SQLite в Android? AndroidRuntimeException: requestFeature () необходимо вызвать перед добавлением содержимого в DialogFragment Как добавить editText.addTextChangedListener в TableLayout Можно ли управлять светодиодом телефона Android без использования объекта уведомления? Пользовательский адаптер Spinner Исключение исключенного события цикла в плагине org.eclipse.ui Треугольник рисования с использованием OpenGl не отображается? Обратный вызов изменения страницы для PagerAdapter ResponsiveVoice.js не работает с компилятором Phonegap Как передать изображение по умолчанию предыдущей активности, если изображение не выбрано Анализ комплексного мыльного ответа

Нормально ли создавать вспомогательную базу данных ORMLite в классе Application?

Я пытаюсь создать приложение для Android с использованием пакета ORMLite. У меня есть несколько видов деятельности и услуг, а также https://github.com/tomquist/Android-Error-Reporter, чтобы иметь возможность получать ошибки от pdas клиентов. ORMLite требует, чтобы все действия и службы расширяли OrmLiteBaseActivity и т. Д. Или добавляли соответствующий код для каждого вида деятельности, чтобы иметь возможность получить поддержку базы данных и освободить ее после завершения работы. Поэтому это не очень удобно добавлять этот код в каждую деятельность или службу. У меня также есть некоторые вспомогательные классы, которые могут использовать базу данных

У меня также есть класс приложений, который содержит некоторую глобальную информацию и методы. Поэтому я решил открыть ormlite helper в классе приложения и использовать его через все действия / классы, подобные этому:

public class MyApplication extends Application { private volatile DatabaseHelper databaseHelper = null; @Override public void onCreate() { super.onCreate(); } @Override public void onTerminate() { if (databaseHelper != null) { OpenHelperManager.releaseHelper(); databaseHelper = null; } super.onTerminate(); } public DatabaseHelper getHelper() { if (databaseHelper == null) { databaseHelper = OpenHelperManager.getHelper(this, DatabaseHelper.class); } return databaseHelper; } } 

И использовать его в других классах следующим образом:

 ((MyApplication) getApplicationContext()).getHelper(); 

Вы думаете, что это хорошая идея использовать его таким образом или могут быть некоторые утечки памяти или другие проблемы с этим? Я беспокоюсь, что onTerminate никогда не работает на реальных устройствах … Я нахожусь на стадии «пробовать новый материал», поэтому хотел бы услышать какие-либо комментарии об этом, чтобы устранить проблемы, которые я могу получить в будущем с неправильным подходом и не имея Переписать код.

Общий механизм выглядит отлично @Alex, но, насколько я знаю, onTerminate() используется только в эмулированных средах, поэтому он не имеет большого onTerminate() . Ваша программа будет убита ОС Android, когда она прекратится на реальном устройстве, поэтому нет причин беспокоиться об утечке памяти и тому подобное.

Что наиболее важно для вашего кода, так это то, что он гарантирует единый экземпляр databaseHelper . Каждый экземпляр имеет свое собственное соединение с базой данных, и проблемы возникают, когда в программе открыто несколько (1) соединений, открытых в базе данных. Sqlite обрабатывает несколько потоков, используя одно и то же соединение одновременно, но не очень хорошо обрабатывает несколько подключений, и могут возникнуть несоответствия данных.