6

データベースで構成されるAndroidアプリを開発しました。モバイルにインストールすると、初めて正常に動作します。以前にインストールしたバージョンをアンインストールせずに、データベースに変更を加えて再度インストールすると、クラッシュします。

注:以前に保存したデータを保持したいので、以前のバージョンをアンインストールしたくありません

友達に提案はありますか?

4

3 に答える 3

3

データベース構造を変更する場合は、データベースのバージョン番号を 1 増やします。(つまり、新しい列の追加、既存の列の削除、列のデータ型の変更、列名の変更など...)。

そして、db ヘルパー クラスの onUpgrade() メソッド内に以下の 2 行を追加します。

db.execSQL("DROP TABLE IF EXISTS your_table_name_goes_here");
onCreate(db);

データベースの現在のバージョン番号を確認するたびに。現在のデータベース バージョンと以前のバージョンの間に不一致が見つかった場合は、単に onUpgrade() メソッドを実行してデータベースをアップグレードします。したがって、すべてのテーブルを削除して、新しいテーブルを再度作成します。これで、db の操作中に「n」個の列を追加/削除できるようになりました。バージョン番号を 1 増やして、db 構造を変更したときに実行するだけです。

于 2012-11-05T14:39:14.240 に答える
2

データベースを作成するとき、これらのコンストラクターが次の場合に使用する可能性があります。

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);

このソリューションを使用すると、データベースに保存されている現在のデータが失われることに注意してください。データベースを維持したい場合は、ロジックを追加してonUpgradeonDowngradeあるバージョンのデータベースから別のバージョンにデータを移行する必要があります。

于 2013-04-03T20:28:50.740 に答える
1

列を追加するなどの変更を行った場合は、完全なアンインストールを行うか、データベースのバージョンをアップグレードする必要があります。

どちらの方法でも、最初に一時データベースを作成してデータのバックアップを作成しない限り、テーブル内のすべてのデータが失われます。

于 2012-11-05T14:26:31.790 に答える