データベースで構成されるAndroidアプリを開発しました。モバイルにインストールすると、初めて正常に動作します。以前にインストールしたバージョンをアンインストールせずに、データベースに変更を加えて再度インストールすると、クラッシュします。
注:以前に保存したデータを保持したいので、以前のバージョンをアンインストールしたくありません
友達に提案はありますか?
データベースで構成されるAndroidアプリを開発しました。モバイルにインストールすると、初めて正常に動作します。以前にインストールしたバージョンをアンインストールせずに、データベースに変更を加えて再度インストールすると、クラッシュします。
注:以前に保存したデータを保持したいので、以前のバージョンをアンインストールしたくありません
友達に提案はありますか?
データベース構造を変更する場合は、データベースのバージョン番号を 1 増やします。(つまり、新しい列の追加、既存の列の削除、列のデータ型の変更、列名の変更など...)。
そして、db ヘルパー クラスの onUpgrade() メソッド内に以下の 2 行を追加します。
db.execSQL("DROP TABLE IF EXISTS your_table_name_goes_here");
onCreate(db);
データベースの現在のバージョン番号を確認するたびに。現在のデータベース バージョンと以前のバージョンの間に不一致が見つかった場合は、単に onUpgrade() メソッドを実行してデータベースをアップグレードします。したがって、すべてのテーブルを削除して、新しいテーブルを再度作成します。これで、db の操作中に「n」個の列を追加/削除できるようになりました。バージョン番号を 1 増やして、db 構造を変更したときに実行するだけです。
データベースを作成するとき、これらのコンストラクターが次の場合に使用する可能性があります。
public TimePointsSQLiteHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, dbName, factory, dbVersion);
}
private TimePointsSQLiteHelper(Context context) {
super(context, dbName, null, dbVersion);
}
ご覧のとおり、変数がありますdbVersion
。これは、発生している問題を回避するためにデータベースのバージョンを示す変数です。提案として、最終的な静的 int 変数を使用してデータベースのバージョン/番号を古いものにして、簡単に変更できるようにします。例えば:
public final static int dbVersion = 1;
次に、現在のアプリとデータに変更を適用するために、onUpgrade(...)
and/orを上書きする必要があります。onDowngrade(...)
それを行う最も簡単で最速の方法は、@SANTHOSHが言及したもので、すべてのテーブルを削除して再度作成するだけです:
db.execSQL("DROP TABLE IF EXISTS your_table_name");
onCreate(db);
このソリューションを使用すると、データベースに保存されている現在のデータが失われることに注意してください。データベースを維持したい場合は、ロジックを追加してonUpgrade
、onDowngrade
あるバージョンのデータベースから別のバージョンにデータを移行する必要があります。
列を追加するなどの変更を行った場合は、完全なアンインストールを行うか、データベースのバージョンをアップグレードする必要があります。
どちらの方法でも、最初に一時データベースを作成してデータのバックアップを作成しない限り、テーブル内のすべてのデータが失われます。