20

データベース内のすべてのテーブルに対してメソッドをSQLiteOpenHelper定義する単一の大きなサブクラスを持つ方が良いですか、それともテーブルごとに 1 つずつ、多くのサブクラスを持つ方が良いですか?onCreateonUpgradeSQLiteOpenHelper

ベストプラクティスはありますか? または、両方とも許容されますが、良い副作用と悪い副作用が異なりますか?

4

3 に答える 3

25

すべてのテーブルに対して単一の SQLiteOpenHelper クラスが必要です。このリンクを確認してください。

于 2012-12-14T11:25:11.957 に答える
5

別のアプローチのためだけに:

onOpen(..)メソッドを呼び出すと、いつでもメソッドをオーバーライドできますonCreate(..)"CREATE TABLE IF NOT EXISTS..."ではなく、ステートメントを必ず使用してください。"CREATE TABLE"

    @Override
public void onOpen(SQLiteDatabase db) {
    onCreate(db);
}

@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_FRIENDS_TABLE = "CREATE TABLE IF NOT EXISTS ...";
    db.execSQL(CREATE_FRIENDS_TABLE);
}

SQLiteOpenHelper から拡張されたすべてのクラスでそれを行います

于 2014-03-23T20:34:11.960 に答える
2

@TheReaderは正しいです。私はすべてのテーブルに対して単一の SQLiteOpenHelper を好みます。これが私が行うことです。「テーブル作成」SQL のリストを SQLiteOpenHelper サブクラスのコンストラクターに渡し、onCreate 関数でリストを繰り返して各テーブルを作成します。したがって、私の SQLiteOpenHelper サブクラスは次のようになります。

public ModelReaderDbHelper(Context context, List<String> createSQLs, List<String> deleteSQLs){
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.TABLE_CREATION_SQLS = createSQLs;
        this.TABLE_DELETE_SQLS = deleteSQLs;
    }
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        for(String oneCreation : TABLE_CREATION_SQLS){
            sqLiteDatabase.execSQL(oneCreation);
        }
    }

しかし、それには別の問題があります。新しいテーブルを追加した後、既存の古いテーブルがインストールされた状態でアプリの新しいバージョンをインストールすると、新しいテーブルは作成されません。古いデータベースが存在すると onCreate 関数が呼ばれた。そのため、ユーザーは最初にアプリをアンインストールしてから、アプリを完全にインストールする必要があります。DATABASE_VERSION が役立ちます。同じ名前で同じ DATABASE_VERSION を持つデータベースが存在する場合にのみ、Android はonCreate 関数を実行しないようです。

于 2014-05-02T15:23:20.383 に答える