データベース内のすべてのテーブルに対してメソッドをSQLiteOpenHelper
定義する単一の大きなサブクラスを持つ方が良いですか、それともテーブルごとに 1 つずつ、多くのサブクラスを持つ方が良いですか?onCreate
onUpgrade
SQLiteOpenHelper
ベストプラクティスはありますか? または、両方とも許容されますが、良い副作用と悪い副作用が異なりますか?
データベース内のすべてのテーブルに対してメソッドをSQLiteOpenHelper
定義する単一の大きなサブクラスを持つ方が良いですか、それともテーブルごとに 1 つずつ、多くのサブクラスを持つ方が良いですか?onCreate
onUpgrade
SQLiteOpenHelper
ベストプラクティスはありますか? または、両方とも許容されますが、良い副作用と悪い副作用が異なりますか?
すべてのテーブルに対して単一の SQLiteOpenHelper クラスが必要です。このリンクを確認してください。
別のアプローチのためだけに:
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 から拡張されたすべてのクラスでそれを行います
@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 関数を実行しないようです。