Можно ли создать помощник базы данных 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 обрабатывает несколько потоков, используя одно и то же соединение одновременно, но не очень хорошо обрабатывает несколько соединений, и могут возникать несоответствия данных.