2 つの列を持つデータベース テーブル test_table と、SQLiteOpenHelper に対応する作成スクリプトがあるとします。
DB_VERSION = 1:
public void onCreate(SQLiteDatabase db)
{
db.execSql("CREATE table test_table (COL_A, COL_B);
}
これは、Play ストアで公開されている最初のアプリ バージョン 1 です。
しばらくすると、アプリと使用されているデータベースが更新されます。SQLiteOpenHelper クラスは次のように適合させる必要があると思います。
DB_VERSION = 2:
public void onCreate(SQLiteDatabase db)
{
db.execSql("CREATE table test_table (COL_A, COL_B, COL_C)");
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSql("ALTER TABLE test_table ADD Column COL_C");
}
しばらくして、別のアプリの更新:
DB_VERSION = 3:
public void onCreate(SQLiteDatabase db)
{
db.execSql("CREATE table test_table (COL_A, COL_B, COL_C, COL_D)");
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSql("ALTER TABLE test_table ADD Column COL_D");
}
--> ここでアドバイスが必要です。ユーザーがアプリ バージョン 1 をインストールすると、列 A と B があります。その後、バージョン 2 に更新すると、onUpgrade が起動し、列 C が追加されます。ゼロからインストールする新しいユーザーは、create ステートメントを介して 3 つの列を取得します。その後、ユーザーがバージョン 3 に更新すると、onUpgrade が再び起動し、列 D が追加されます。しかし、ユーザーがアプリ バージョン 1 をインストールし、バージョン 2 の更新をスキップしてバージョン 3 を更新した場合はどうなるでしょうか? それから彼は逃しただろう
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSql("ALTER TABLE test_table ADD Column COL_C");
}
一部のみ
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSql("ALTER TABLE test_table ADD Column COL_D");
}
テーブルtest_table(COL_A、COL_B、COL_D)につながると呼ばれますか?
ユーザーが自分のデータを失わないように、ライブ アプリのデータベース アップグレードを処理する正しい方法は何ですか? onUpgrade() メソッドで考えられるすべての (古い) バージョンをチェックし、そのバージョンに基づいて別の alter table ステートメントを実行する必要がありますか?
私のアプリでは、ユーザーはデータをエクスポートおよびインポートする可能性があるため、これはエクスポートにすぎません: データベース全体をコピーし、インポート: アプリ データベースをバックアップ コピー データベースに置き換えます。
ユーザーがアプリ バージョン 1 を持っていて、データベースをエクスポートし、アプリ (新しいデータベース構造) をアップグレードして、古いバージョン 1 のバックアップをインポートするとどうなりますか? --> SQLiteOpenHelper はどのように動作しますか? --> インポート/エクスポート機能とともにデータベースのアップグレードを処理する正しい方法は何ですか?