2014-11-30 2 views
0

Я прочитал несколько «ответов», но не смог найти окончательного ответа.Когда закрыть базу данных в Android

У меня есть приложение, выполняющее операции DB с использованием AsyncTask, поэтому оно может выполняться в любом из потоков в пуле. У меня также есть фоновый поток для синхронизации данных (длительная работа)

Какую модель использовать?

Раскладка 1: Открытие и закрытие для каждой операции, пример:

db = SQLiteOpenHelper.getWriteableDatabase() 
// Do some operations such as insert/select ... 
db.close(); 

шаблон 2: Открыть один раз в запуске приложения, обмен между всеми нитями и близко при завершении приложения, пример:

Application: 
public void onCreate(){ .. open database and cache the instance ... } 

Шаблон 3: Внедрение некоторой формы подсчета ссылок для обнаружения, когда выпущены все ссылки на кешированный экземпляр. (Я думал, что Android уже реализовал это изначально, но я ошибся)

Я видел код для SQLiteOpenHelper.getWriteableDatabase(), он возвращает тот же экземпляр, если он не закрыт. Таким образом, для шаблона 1, 2 потока могут получить один и тот же экземпляр, и один поток может закрывать экземпляр, когда другой поток выполняет операцию. Это приводит к тому, что в моем приложении «процедура библиотеки выполняется из последовательности». Узор 1 также кажется излишним для открытия и закрытия нескольких раз.

Образец 2 кажется более безопасным, но как определить, когда приложение завершается? Кажется, что нет надежного способа. Что происходит, когда база данных не закрывается, когда приложение завершается?

ответ

-1

После многих исследований и испытаний я пришел к выводу, что закрытие локальной базы данных SQlite действительно не требуется. Я использую синглтона SQliteOpenHelper, как показано ниже:

public class MyApplication extends Application{ 
    private static MyApplication instance; 
    public MyApplication(){ 
     instance = this; 
    } 
    public static Context getContext(){ 
     return instance; 
    } 
} 

public class LocalDBHelper extends SQLiteOpenHelper{ 
    private static final int DATABASE_VERSION = 1; 
    private static final String DATABASE_NAME = "MyDB"; 
    private static final String LOG_TAG = "LocalDBHelper"; 

    private static LocalDBHelper instance = null; 
    /*private constructor to avoid direct instantiation by other classes*/ 
    private LocalDBHelper(){ 
     super(MyApplication.getContext(), DATABASE_NAME, null, DATABASE_VERSION); 
    } 
    /*synchronized method to ensure only 1 instance of LocalDBHelper exists*/ 
    public static synchronized LocalDBHelper getInstance(){ 
     if(instance == null){ 
      instance = new LocalDBHelper(); 
     } 
     return instance; 
    } 
    ... 
    ... 
} 

я получить базу данных по LocalDBHelper.getInstance().getWritableDatabase().

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

Смежные вопросы