2016-04-19 9 views
0

今、私はそうのようSQLOpenHelperクラスの静的インスタンスを使用しています:正しい方法でデータベースを開いたり閉じたりできますか?

public class DatabaseHelper extends SQLiteOpenHelper { 
    private static DatabaseHelper mInstance = null; 
    private final Context mContext; 

    //... 

    public static synchronized DatabaseHelper getInstance(Context context) { 
     /** 
     * use the application context as suggested by CommonsWare. 
     * this will ensure that you don't accidentally leak an Activity's 
     * context (see this article for more information: 
     * http://android-developers.blogspot.nl/2009/01/avoiding-memory-leaks.html) 
     */ 
     if (mInstance == null) { 
      mInstance = new DatabaseHelper(context.getApplicationContext()); 
     } 
     return mInstance; 
    } 

    private DatabaseHelper(Context context) { 
     super(context, DB_NAME, null, DB_VERSION); 
     mContext = context; 
    } 

    //... 
} 

そして、そのようなDatabaseProcessorクラス:

public class DatabaseProcessor { 

    private SQLiteDatabase mDatabase; 
    private DatabaseHelper mSQLHelper; 
    private Context mContext; 

    public DatabaseProcessor(Context context) { 
     mContext = context; 
     mSQLHelper = DatabaseHelper.getInstance(mContext); 
    } 

    public void open() throws SQLException { 
     mDatabase = mSQLHelper.getWritableDatabase(); 
    } 

    public void close() { 
     mDatabase.close(); 
    } 

    //... 
} 

だから私は自分のデータベースにアクセスしたい場合、私は

DatabaseProcessor mDatabaseProcessor = new DatabaseProcessor(this); 
mDatabaseProcessor.open(); 
mSomeList = mDatabaseProcessor.doSomeQueryAndReturnResults(); 
mDatabaseProcessor.close(); 

これは正しい方法ですか?または、データベースActivityのonResume()メソッドでデータベースを開き、onPause()の間に閉じてください。クエリを実行しようとすると、データベースが開いていない状況で正しくエラーをスローするにはどうすればよいですか?

EDITリファクタリングバージョン:

public class DatabaseHelper extends SQLiteOpenHelper { 
    private static SQLiteDatabase mDatabase; 
    private static DatabaseHelper mInstance = null; 
    private static Context mContext; 

    // ... 

    public static synchronized DatabaseHelper getInstance(Context context) { 
     /** 
     * use the application context as suggested by CommonsWare. 
     * this will ensure that you don't accidentally leak an Activity's 
     * context (see this article for more information: 
     * http://android-developers.blogspot.nl/2009/01/avoiding-memory-leaks.html) 
     */ 
     if (mInstance == null) { 
      mInstance = new DatabaseHelper(context.getApplicationContext()); 
     } 
     return mInstance; 
    } 

    private DatabaseHelper(Context context) { 
     super(context, DB_NAME, null, DB_VERSION); 
     mContext = context; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(DB_CREATE_SOME_TABLE); //some SQL expression 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL(DB_ALTER); 
    } 

    public void open() throws SQLException { 
     mDatabase = getWritableDatabase(); 
    } 

    public void close() { 
     mDatabase.close(); 
    } 

    public boolean isOpen() { 
     return mDatabase.isOpen(); 
    } 

    //below this would be various CRUD functions operating on mDatabase 
    // ... 
    // ... 
} 
+1

通常、答えは決してデータベースを閉じることではありません。データベースのI/Oはバックグラウンドスレッドで行う必要があるため、単一のアクティビティ(複数のアクティビティ、多分サービスまたは2つのアクティビティなど)を超えてデータベースを操作することがあるため、多くの場合、データベースを使用します。あなたのアプリケーションの一部がまだそれと共に働いている間、あなたはそれを閉じたくはありません。 – CommonsWare

+0

オープンにしておくとデータが破損する危険性が増しますか?私はしばらくの間、ランダムなLogcatエラーを思い出しました。私はデータベースにリークがあったことを通知しました。使用していないときに閉じなければなりません。 – KaliMa

+0

それ以外の場合:Launcherアクティビティで、データベース、 'open()'それは決して 'close()'を呼び出さないでしょうか?そして、データベースにアクセスする必要がある場合はどこでも 'newInstance()'を使うだけです。 – KaliMa

答えて

0

最良の方法は、try-catchにクエリ/トランザクション文を配置し、すべてのリソースを解放し、finallyブロックで接続をクローズできます。

try{ 
     mSomeList = mDatabaseProcessor.doSomeQueryAndReturnResults(); 
} catch(Exception exc){ 
    //Catch exceptions here 
} 
finally{ 
    if(mDatabaseProcessor != null) 
     mDatabaseProcessor.close(); 
} 
+1

一般的な例外をキャッチしても疑わしいとは考えていませんか? – KaliMa

+0

私はあなたに例を挙げました。間違いなく、コードに従って特定の例外を捕捉する必要があります。 –

関連する問題