以下のコードがあります。
SQLiteOpenHelper を使用するアプリケーションでデータベースを作成しています。いくつかの懸念事項があり、ご相談いただければ幸いです。これらに対する直接的な回答は、主観的なものである可能性があるため、スタック オーバーフローでは見つかりませんでした。
1 - このデータベースをいくつかのアクティビティで使用します。ただし、リークを避けるためにこれをシングルトンにするつもりはありませんが、各メソッド内で getWritableDatabase() と getReadableDatabase() を取得する予定です。各アクティビティの onDestroy() 内で db.close() を実行する予定です。これは賢明ですか? 私のアプリにはいくつかのアクティビティがあり、巨大なアプリではありません。
2 - 私は DAO モデルに従っておらず、テーブルごとに異なるクラスを使用していません。私の見方では、私はそうする必要はありません。私は?
3 - (相談ではなく質問) 以下のコードでは、フォームのデータベースを作成していません。
private SQLiteDatabase database;
したがって、(私のアクティビティからの) データベースへのすべての参照は、同じサブクラス化された SQLiteOpenHelper のメソッドを介して行われているため、物理的に作成されたデータベースを getWritableDatabase および getReadableDatabase を介して直接参照しています。SQLiteDatabase のインスタンスを作成して使用する必要がありますか? SQLiteOpenHelper のサブクラス内でも?
以下はコードです。
public class DbHelper extends SQLiteOpenHelper
{
private static final String DATABASE_NAME = "myDbName";
private static final String DATABASE_TABLE = "myTable";
private static final int DATABASE_VERSION = 1;
private Context ctx;
public DbHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.ctx = context;
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL("CREATE TABLE myTable(_id INTEGER PRIMARY KEY, title TEXT);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
//nothing here now. maybe later.
}
public void insertTitle(String title)
{
ContentValues titleCV = new ContentValues();
titleCV .put("title", title);
getWritableDatabase().insert(DATABASE_TABLE, null, titleCV );
}
public void getTitles()
{
Cursor result = getReadableDatabase().rawQuery("SELECT _id, title FROM myTable", null);
while (result.moveToNext())
{
int id = result.getInt(0);
String titleGotten= result.getString(1);
}
result.close();
}