Настройка Ormlite без использования базовых действий - PullRequest
12 голосов
/ 05 октября 2011

Я использую 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, если это еще не сделано.

Может кто-нибудь сказать мне, правильно это или неправильно, или я на правильном пути?

Спасибо!

Ответы [ 2 ]

15 голосов
/ 05 октября 2011

Я использую 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()? Вам придется увеличивать счетчик для каждого запроса get и только для вызова, когда счетчик вернется к 0. Но даже в этом случае я не уверен на 100%, сколько строк вы сэкономите из своего класса активности.

2 голосов
/ 05 октября 2011

Я мог бы придираться, но по сути вы делаете это правильно.

Вызов

dbHelper = (DBHelper) OpenHelperManager.getHelper(context, DBHelper.class);

Ищет класс DBHelper и создает его для контекста.Если вы определили его в своем strings.xml, вы можете оставить в конце DBHelper.class.

onUpgrade у вас DBHelper.java, вы можете рассмотреть возможность удаления таблицы, созданной в onCreate, а затем вызовите onCreate (чтобы убедиться, что у вас нет проблем с конвертацией из обновления в обновление).Вы можете сделать более сложное обновление, если хотите.

Кроме того, это выглядит хорошо.Если вы в конечном итоге захотите использовать методы доступа к данным для ваших объектов БД помимо базовых методов DAO, вам, в конце концов, захочется создать более тщательные реализации ваших объектных DAO, но это хорошее начало.

...