0

以下のコードがあります。

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();
}
4

3 に答える 3

2

Q1

アプリ内に 2 つの並列スレッドがデータベースにアクセスするシナリオがある場合は、の単一インスタンスSQLiteOpenHelper(シングルトンまたはメンバーApplicationなど) を使用します。そうでない場合は、必要ありません。

の呼び出しについてはdb.close()、 にある場合は問題ありませんonDestroy()

Q2

DAO は、プロジェクトの保守とスケーリングを容易にする抽象化レイヤーです。コードをスケーリングまたは維持する予定がない場合 (今後のリリースなど)、必要ないと思います。

Q3

のインスタンスを作成する必要はありませんSQLiteDatabsegetReadableDatabase()またはgetWritableDatabase()を呼び出すSQLiteOpenHelperと、インスタンスが作成および維持されます。次回 を呼び出すときに、同じインスタンスが使用されますgetReadable\WritableDatabase()

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2013-07-19T14:50:58.157 に答える