SQLiteOpenHelperとSingletonパターンを組み合わせたデータベースアクセス方法
Singletonパターンを用いたSQLiteDatabaseの使用方法
Singletonパターンは、唯一つのインスタンスのみを生成し、それを共有する設計パターンです。データベースへのアクセスは、アプリ全体で一貫性を持たせるために重要です。Singletonパターンを用いることで、SQLiteDatabaseへのアクセスを一元管理し、以下の利点を享受できます。
- データの一貫性: 複数のインスタンスが同時にアクセスすることによるデータの不整合を防ぎます。
- パフォーマンスの向上: 接続の確立や切断を繰り返す必要がなくなり、パフォーマンスが向上します。
- メモリ使用量の削減: 複数のインスタンスを生成することによるメモリ使用量を抑えます。
実装
以下のコードは、Singletonパターンを用いたSQLiteDatabaseの使用方法を示しています。
public class DatabaseHelper {
private static final DatabaseHelper INSTANCE = new DatabaseHelper();
private SQLiteDatabase database;
private DatabaseHelper() {
// データベースを開く
database = SQLiteDatabase.openOrCreateDatabase(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS),
"database.db",
null
);
}
public static DatabaseHelper getInstance() {
return INSTANCE;
}
public SQLiteDatabase getDatabase() {
return database;
}
public void close() {
// データベースを閉じる
database.close();
}
}
使用方法
// データベースヘルパーのインスタンスを取得
DatabaseHelper helper = DatabaseHelper.getInstance();
// データベースを取得
SQLiteDatabase database = helper.getDatabase();
// データベースへの操作を行う
database.execSQL("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)");
database.insert("users", null, new ContentValues());
// データベースを閉じる
helper.close();
ポイント
- コンストラクタをprivateにすることで、外部からのインスタンス生成を禁止します。
- getInstance()メソッドをstaticメソッドとして提供することで、唯一つのインスタンスを取得できるようにします。
- getDatabase()メソッドをpublicメソッドとして提供することで、データベースへのアクセスを提供します。
- close()メソッドを提供することで、データベースを閉じることを可能にします。
public class DatabaseHelper {
private static final DatabaseHelper INSTANCE = new DatabaseHelper();
private SQLiteDatabase database;
private DatabaseHelper() {
// データベースを開く
database = SQLiteDatabase.openOrCreateDatabase(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS),
"database.db",
null
);
}
public static DatabaseHelper getInstance() {
return INSTANCE;
}
public SQLiteDatabase getDatabase() {
return database;
}
public void close() {
// データベースを閉じる
database.close();
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// データベースヘルパーのインスタンスを取得
DatabaseHelper helper = DatabaseHelper.getInstance();
// データベースを取得
SQLiteDatabase database = helper.getDatabase();
// データベースへの操作を行う
database.execSQL("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)");
database.insert("users", null, new ContentValues());
// データベースを閉じる
helper.close();
}
}
解説
DatabaseHelper
クラスは、Singletonパターンを用いてSQLiteDatabaseへのアクセスを管理します。MainActivity
クラスは、DatabaseHelper
クラスを使用してデータベースへの操作を行います。
実行方法
- Android Studioでプロジェクトを作成します。
- 上記のコードを
MainActivity.java
ファイルに記述します。 - アプリを実行します。
注意事項
- データベースへのアクセスには、適切な権限が必要です。
Singletonパターン以外の方法
Applicationクラスを使用する
Applicationクラスは、アプリケーション全体のライフサイクルに関わるクラスです。ApplicationクラスにSQLiteDatabaseのインスタンスを保持することで、アプリ全体で共有することができます。
コード例
public class MyApplication extends Application {
private SQLiteDatabase database;
@Override
public void onCreate() {
super.onCreate();
// データベースを開く
database = SQLiteDatabase.openOrCreateDatabase(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS),
"database.db",
null
);
}
public SQLiteDatabase getDatabase() {
return database;
}
}
// Applicationクラスを取得
MyApplication application = (MyApplication) getApplicationContext();
// データベースを取得
SQLiteDatabase database = application.getDatabase();
// データベースへの操作を行う
database.execSQL("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)");
database.insert("users", null, new ContentValues());
Dependency Injectionを使用する
Dependency Injectionは、オブジェクト間の依存関係を構築する設計パターンです。Dependency Injectionを使用することで、SQLiteDatabaseへのアクセスを管理するコードを別のクラスに切り出すことができます。
public interface DatabaseProvider {
SQLiteDatabase getDatabase();
}
public class DatabaseHelper implements DatabaseProvider {
private SQLiteDatabase database;
public DatabaseHelper() {
// データベースを開く
database = SQLiteDatabase.openOrCreateDatabase(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS),
"database.db",
null
);
}
@Override
public SQLiteDatabase getDatabase() {
return database;
}
}
public class MainActivity extends AppCompatActivity {
@Inject
DatabaseProvider databaseProvider;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// データベースを取得
SQLiteDatabase database = databaseProvider.getDatabase();
// データベースへの操作を行う
database.execSQL("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)");
database.insert("users", null, new ContentValues());
}
}
- Dependency Injectionライブラリをプロジェクトに追加します。
DatabaseProvider
インターフェースを実装するクラスを作成します。MainActivity
クラスにDatabaseProvider
インターフェースを注入します。
どの方法を選択するべきか
どの方法を選択するべきかは、アプリの規模や複雑性によって異なります。
- 小規模なアプリであれば、Singletonパターンで十分です。
- 大規模なアプリや複雑なアプリであれば、ApplicationクラスやDependency Injectionを使用することを検討してください。
java android sqlite