Подтвердить что ты не робот

Правильно открыть/закрыть базу данных с шаблоном проектирования Singleton

Я создаю приложение, которое делает много взаимодействий с базой данных (как операций чтения, так и записи).

Чтобы избежать операций открытия/закрытия при каждом запросе, я создал класс, расширяющий SQLiteOpenHelper с шаблоном проектирования Singleton. Таким образом, я уверен, что только один экземпляр SQLiteOpenHelper и только одно соединение с базой данных выполняется на протяжении всего жизненного цикла приложения (и не только жизненного цикла активности).

Я также читал некоторые статьи о ContentProvider, но я не уверен, что это лучший способ.

Итак, это основная логика моего класса Singleton (onCreate и onUpgrade удалена):

public final class BaseSQLite extends SQLiteOpenHelper {

    private static BaseSQLite mInstance = null;

    private SQLiteDatabase db = null;

    public static BaseSQLite getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new BaseSQLite(context.getApplicationContext(),
                    DBNAME, DBVERSION);
        }
        return mInstance;
    }

    private BaseSQLite(final Context context, final String name,
            final int version) {
        super(context, name, null, version);
        db = getWritableDatabase();
    }

    @Override
    public synchronized void close() {
        if (mInstance != null)
            db.close();
    }

    public Cursor getAllData() {
        String buildSQL = "SELECT * FROM myTable";

        return db.rawQuery(buildSQL, null);
    }

}

Итак, чтобы получить доступ к моей базе данных, я сделал следующее:

BaseSQLite baseSQLite = BaseSQLite.getInstance(context);
baseSQLite.getAllData();

Теперь он отлично работает. Но мой вопрос касается метода close(). Я действительно не знаю, когда позвонить. На самом деле, мой экземпляр базы данных одинаковый для каждой активации моего приложения, поэтому я считаю, что плохой идеей вызывать close() в методе onPause(), потому что экземпляр будет потенциально (и это часто случается) воссоздан в onStart() метода следующего действия. Кроме того, я не могу обнаружить end моего приложения, то есть когда активность больше не видна на экране.

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

4b9b3361

Ответ 1

Вам следует позвонить в любое время, когда вы закончите запись в свою базу данных. Например, когда вы вставляете данные, у вас будет открытое соединение с базой данных, которое должно быть закрыто, когда это будет сделано.

Чтение отличается. Когда вы создаете базу данных SQLite на своем телефоне, данные сохраняются. База данных существует, и созданный вами обработчик обеспечивает удобный способ доступа к этой информации. Чтение базы данных обычно происходит путем получения читаемого экземпляра базы данных и использования Cursor для извлечения значений. В этом случае вы закрываете курсор, когда вы закончите, а не саму базу.

Вы правы, что вы не должны закрывать соединение с базой данных в ходе жизненных циклов отдельных действий. Вместо этого, как было предложено выше, закройте соединение с базой данных в методах обработчика, которые записываются в базу данных, когда вы закончите выполнение этой транзакции.