以下は、考えられる 3 つのアプローチを示すサンプル コードです。これらにより、アプリケーション全体でデータベースへのアクセスが許可されます。
アプローチ #1: `SQLiteOpenHelper` を静的データ メンバーにする
DatabaseHelper
これは完全な実装ではありませんが、クラスを正しく設計する方法についての良いアイデアが得られるはずです。静的ファクトリ メソッドにより、DatabaseHelper インスタンスが常に 1 つだけ存在することが保証されます。
/**
* create custom DatabaseHelper class that extends SQLiteOpenHelper
*/
public class DatabaseHelper extends SQLiteOpenHelper {
private static DatabaseHelper mInstance = null;
private static final String DATABASE_NAME = "databaseName";
private static final String DATABASE_TABLE = "tableName";
private static final int DATABASE_VERSION = 1;
private Context mCxt;
public static DatabaseHelper getInstance(Context ctx) {
/**
* use the application context as suggested by CommonsWare.
* this will ensure that you dont accidentally leak an Activitys
* context (see this article for more information:
* http://android-developers.blogspot.nl/2009/01/avoiding-memory-leaks.html)
*/
if (mInstance == null) {
mInstance = new DatabaseHelper(ctx.getApplicationContext());
}
return mInstance;
}
/**
* constructor should be private to prevent direct instantiation.
* make call to static factory method "getInstance()" instead.
*/
private DatabaseHelper(Context ctx) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.mCtx = ctx;
}
}
アプローチ #2: SQLite データベースを「ContentProvider」で抽象化する
これが私が提案するアプローチです。1 つは、新しいCursorLoader
クラスはs を必要とするため、Activity または Fragment を で実装しContentProvider
たい場合(これを利用することをお勧めします。魔法のようです!)、アプリケーションに を実装する必要があります。さらに、ContentProvider を使用してシングルトン データベース ヘルパーを作成することについて心配する必要はありません。アクティビティから呼び出すだけで、システムがすべて処理してくれます (つまり、複数のインスタンスが作成されるのを防ぐためにシングルトン パターンを設計する必要はありません)。LoaderManager.LoaderCallbacks<Cursor>
CursorLoader
ContentProvider
getContentResolver()
お役に立てれば!