Ormlite setup без использования базовых действий
Я использую ORMLite в проекте android, и я не хочу использовать расширенные действия, потому что я вставляю значения в базу данных на AsyncTask.
В документах говорится:
"Если вы не хотите расширять OrmLiteBaseActivity
и другие базовые классы, вам нужно будет дублировать их функциональность. Вам нужно будет позвонить OpenHelperManager.getHelper(Context context, Class openHelperClass)
в начале вашего кода, сохранить помощника и использовать его как как вы хотите, а затем вызовите OpenHelperManager.release()
, когда вы закончите с ним."
Он также говорит, чтобы добавить вспомогательный класс базы данных в strings.xml
, который у меня есть. Поэтому я не уверен, что я делаю неправильно.
Я использую класс под названием DataAccess
для моего уровня данных, который выглядит так:
public class DataAccess {
private Context context;
private DBHelper dbHelper;
public DataAccess(Context _context) {
this.context = _context;
dbHelper = getDBHelper(_context);
}
private DBHelper getDBHelper(Context context) {
if (dbHelper == null) {
dbHelper = (DBHelper) OpenHelperManager.getHelper(context, DBHelper.class);
}
return dbHelper;
}
}
И я использую расширенный вспомогательный класс:
public class DBHelper extends OrmLiteSqliteOpenHelper {
private static final String DATABASE_NAME = "database.db";
private static final int DATABASE_VERSION = 1;
private Dao<SomeObject, Integer> someObjectTable = null;
private ConnectionSource connectionSource = null;
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) {
this.connectionSource = connectionSource;
try {
TableUtils.createTable(connectionSource, SomeObject.class);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
@Override
public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int oldVersion, int newVersion) {
}
public Dao<SomeObject, Integer> getSomeObjectDao() throws SQLException {
if (someObjectTable == null) {
dateTable = getDao(SomeObject.class);
}
return someObjectTable;
}
Идея состоит в том, чтобы создать класс DataAccess
и создать DBHelper
, если он еще не был.
Может ли кто-нибудь сказать мне, правильно это или нет, или если я на правильном пути?
Спасибо!
Ответы
Ответ 1
Я использую ORMLite в проекте android, и я не хочу использовать расширенные действия, потому что я вставляю значения в базу данных в AsyncTask.
Вы на правильном пути, но немного выключены @Matt. Честно говоря, я никогда не делал проект без расширения базовых классов. Но это хорошее упражнение, поэтому я создал этот проект примера ORMLite, который использует Activity
и управляет собственным помощником.
Ваш класс DBHelper
хорош, но вам действительно не нужен ваш класс DataAccess
. В каждой из ваших действий (или услуг...) вам нужно будет что-то вроде следующего:
private DBHelper dbHelper = null;
@Override
protected void onDestroy() {
super.onDestroy();
if (dbHelper != null) {
OpenHelperManager.releaseHelper();
dbHelper = null;
}
}
private DBHelper getHelper() {
if (dbHelper == null) {
dbHelper = (DBHelper)OpenHelperManager.getHelper(this, DBHelper.class);
}
return dbHelper;
}
Вы [очевидно], затем используйте это в своем коде, сделав что-то вроде:
Dao<SomeObject, Integer> someObjectDao = getHelper().getSomeObjectDao();
Поэтому всякий раз, когда вы вызываете getHelper()
в первый раз, он получает помощника через менеджера, устанавливая соединение с базой данных. Всякий раз, когда ваше приложение будет уничтожено ОС, оно освободит помощника - возможно, закрывает базовое соединение с базой данных, если оно является последней версией.
Обратите внимание, что OpenHelperManager.getHelper()
нуждается в Context
в качестве первого аргумента, если вы делаете это без базового класса Activity
.
Edit:
Если вы хотите создать класс типа DataAccess
для централизации обработки вспомогательного класса, вам нужно будет сделать методы статическими и сделать свой собственный счетчик использования. Если есть несколько действий и фоновые задачи, вызывающие getHelper()
, тогда возникает вопрос, когда вы вызываете releaseHelper()
? Вам нужно увеличить счетчик для каждого выпуска и только освобождения от звонка, когда счетчик вернется к 0. Но даже тогда я не на 100% уверен, сколько строк вы выберете из своего класса активности.
Ответ 2
Я мог бы сделать nitpick, но по существу вы делаете это правильно.
Вызов
dbHelper = (DBHelper) OpenHelperManager.getHelper(context, DBHelper.class);
Выбирает класс DBHelper
и создает его для контекста. Если вы определили его в своем файле strings.xml, вы можете оставить его в конце DBHelper.class.
onUpgrade
в DBHelper.java
, вам может потребоваться отбросить таблицу, созданную в onCreate
, а затем вызвать onCreate
(чтобы убедиться, что у вас нет проблем с переходом от обновления до обновления). Вы могли бы сделать более сложное обновление, если хотите.
Кроме этого, он выглядит хорошо. Если вам не нужны методы доступа к данным для объектов БД за пределами базовых методов DAO, вы в конечном итоге захотите создать более тщательные реализации ваших DAO-объектов, но это хороший старт.