良い実践につながる可能性のあるアプローチがいくつかあります。Vogella のブログは常に参考になりました。このアプローチをご覧ください。これは、データベースの作成と更新を制御するクラスと、特定のタイプのオブジェクトに必要な要求を行う DAO としての別のクラスで構成されています。
個人的には、Singleton クラス内で両方を組み合わせて使用してきました。これは、インスタンス (私の場合は SQLiteDatabase) のライフサイクル全体を維持および制御するのに最適で、開かずに実行する必要があるタスクを作成できます。データベースオブジェクトへの参照を閉じたり失ったりします。同じクラスが SQLiteOpenHelper から継承され、データベースの作成と更新を管理します。
一般的な構造は次のようになります。
package your.package;
import java.io.File;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBManager extends SQLiteOpenHelper {
private static DBManager sInstance;
private static SQLiteDatabase db;
private final String LOG_TAG = this.getClass().getSimpleName();
private static final String DB_NAME = "DBName";
private static final int DB_VERSION = 1;
public static synchronized DBManager getInstance(Context _c) {
if (sInstance == null) {
sInstance = new DBManager(_c);
}
return sInstance;
}
private DBManager(Context _c) {
super(_c, DB_NAME, null, DB_VERSION);
}
public void deleteTable(String table) {
if (db == null || !db.isOpen()) {
db = getWritableDatabase();
}
db.execSQL("DROP TABLE " + table);
db.close();
}
public void reset() {
File dbFile = new File(getReadableDatabase().getPath());
dbFile.delete();
sInstance = null;
db.close();
}
public static void closeDB() {
if (sInstance != null && db != null && db.isOpen()) {
db.close();
}
}
public long insertContent(String table, ContentValues cv) {
if (db == null || !db.isOpen()) {
db = getWritableDatabase();
}
return db.insert(table, null, cv);
}
public void updateContent(String table, ContentValues cv, String whereClause, String[] whereArgs) {
if (db == null || !db.isOpen()) {
db = getWritableDatabase();
}
db.update(table, cv, whereClause, whereArgs);
}
@Override
public void onCreate(SQLiteDatabase db) {
if (db == null || !db.isOpen()) {
db = getWritableDatabase();
}
db.execSQL("your query");
}
@Override
public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
Log.i(LOG_TAG, "onUpgrade old: " + oldVersion + " new: " + newVersion);
}
}