Можно ли создать помощник базы данных 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 никогда не работает на реальных устройствах... Я нахожусь на стадии "пробовать новый материал", поэтому хотел бы услышать какие-либо комментарии об этом, чтобы устранить проблемы, которые я могу получить в будущем с неправильным подходом и не имея переписать код.
Ответы
Ответ 1
Общий механизм выглядит отлично @Alex, но насколько я знаю, onTerminate()
используется только в эмулированных средах, поэтому он не имеет большого смысла. Ваша программа будет убита ОС Android, когда она закончится на реальном устройстве, поэтому нет причин беспокоиться о утечке памяти и о том, что такое.
Что наиболее важно с вашим кодом, так это то, что он гарантирует единственный экземпляр databaseHelper
. Каждый экземпляр имеет свое собственное соединение с базой данных, и проблемы возникают, когда в программе открыто несколько (1) соединений, открытых в базе данных. Sqlite обрабатывает несколько потоков, используя одно и то же соединение одновременно, но не очень хорошо обрабатывает несколько соединений, и могут возникать несоответствия данных.