今、私はそうのよう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
// ...
// ...
}
通常、答えは決してデータベースを閉じることではありません。データベースのI/Oはバックグラウンドスレッドで行う必要があるため、単一のアクティビティ(複数のアクティビティ、多分サービスまたは2つのアクティビティなど)を超えてデータベースを操作することがあるため、多くの場合、データベースを使用します。あなたのアプリケーションの一部がまだそれと共に働いている間、あなたはそれを閉じたくはありません。 – CommonsWare
オープンにしておくとデータが破損する危険性が増しますか?私はしばらくの間、ランダムなLogcatエラーを思い出しました。私はデータベースにリークがあったことを通知しました。使用していないときに閉じなければなりません。 – KaliMa
それ以外の場合:Launcherアクティビティで、データベース、 'open()'それは決して 'close()'を呼び出さないでしょうか?そして、データベースにアクセスする必要がある場合はどこでも 'newInstance()'を使うだけです。 – KaliMa