1

各 SQLite テーブルのコード (テーブルの初期構築とそのテーブルに対する操作を含む) を、SQLiteOpenHelper を拡張する個別のクラスに分割しています。

これらのテーブルを作成する (つまり、onCreate() メソッドを呼び出す) には、DATABASE_VERSION をインクリメントする必要があります (詳細については、こちらの回答を参照してください)。

しかし、この方法論では、クラス/テーブルごとに異なるバージョン番号になります。作成した 2 番目のテーブルの DATABASE_VERSION 値を 2 に設定する必要があり、3 番目のテーブルを 3 に設定する必要があります。

そのため、同じ DATABASE (*.db ファイル) に対して複数の異なるバージョン値を使用することになります。それらがすべて同じ値である場合、onUpgrade() メソッドは呼び出されないため、onCreate() メソッドは呼び出されず、新しいテーブルは作成されません。

これは「大丈夫」ですか?複数の異なるバージョン番号を持つデータベースを持っていますか?

私が知っている唯一の他の(合理的な)オプションは、すべてのDBコード(複数のテーブルをカバーする)をSQLiteOpenHelperを拡張する単一のクラスに入れることです-実際にそうするのが好ましい方法ですか?IOW、テーブルごとに 1 つずつ、いくつかのクラスに db コードを分離することは、助けになりますか、それとも妨げになりますか?

アップデート

CommonsWareのアドバイスに従って、SQLiteOpenHelperを拡張するクラスを1つだけ使用して、新しいテーブルを徐々に追加するための私の非破壊的な方法です(「IF NOT EXISTS」をDDLに挿入することによる):

@Override
public void onCreate(SQLiteDatabase db) {
    String CONDITIONALLY_CREATE_VENDORS_TABLE = "CREATE TABLE IF NOT EXISTS " +
            TABLE_VENDORS + "("
            + COLUMN_ID + " INTEGER PRIMARY KEY," + COLUMN_VENDORID
            + " TEXT," + COLUMN_COMPANYNAME + " TEXT" + ")";
    db.execSQL(CONDITIONALLY_CREATE_VENDORS_TABLE);
    // add more tables as needed following the pattern above
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    //db.execSQL("DROP TABLE IF EXISTS " + TABLE_VENDORS); <= Only need to DROP if the table's structure changes; so comment such a line out for the particular table in that case
    onCreate(db);
}

: 新しいテーブルを追加するときはいつでも onUpgrade()/onCreate() が呼び出されるように、DATABASE_VERSION 値を「上げる」(インクリメントする) 必要があります。

4

1 に答える 1

3

各 SQLite テーブルのコード (テーブルの初期構築とそのテーブルに対する操作を含む) を、SQLiteOpenHelper を拡張する個別のクラスに分割しています。

他の理由の中でも特にスレッドの安全性のために、SQLiteDatabase一貫して使用する単一のインスタンスを持つことが重要です。SQLiteOpenHelperそのため、単一のクラスが必要になります。例外は、完全に独立したデータベース ファイル (SQLiteHelperデータベースごとに 1 つ) の場合ですが、通常は必要ありません。

これは「大丈夫」ですか?複数の異なるバージョン番号を持つデータベースを持っていますか?

それは決して「大丈夫」ではありません。最も高い数が勝ちます。

私が知っている唯一の他の(合理的な)オプションは、すべてのDBコード(複数のテーブルをカバーする)をSQLiteOpenHelperを拡張する単一のクラスに入れることです-実際にそうするのが好ましい方法ですか?IOW、db コードをテーブルごとに 1 つずつ、いくつかのクラスに分離することは、助けになるか妨げになりますか?

「db コードをテーブルごとに 1 つずつ、複数のクラスに分割する」ことは、必ずしも問題ではありません。問題は、それらを の独立したサブクラスにすることですSQLiteOpenHelper

これらのクラスで、テーブルの作成とアップグレードだけでなく、テーブルに関連するその他の CRUD 操作も処理する必要があるとします。そのための専用クラスを持つことは問題ありません。ただし、テーブルの作成とアップグレードのロジックは、単一のSQLiteOpenHelperクラスによって駆動される必要があります。テーブルごとのクラスへの実際の作業を委任するonCreate()だけonUpgrade()です。このようにして、複数のクラスSQLiteOpenHelperを持たずにコードを編成できます。SQLiteOpenHelper

于 2014-04-15T17:25:29.217 に答える