私はSQLiteDBを使用してAndroidアプリを書いています。
実験はほとんどなく、DBバージョンを1から2に変更しました。
その後、DBスキーマが安定しました。アプリをリリースしなかったため、自分で使用するためです。
もう一度バージョンを1に変更することにしました。
フレッシュインストールを行い、すべてが正常に機能しました。
ただし、2回実行すると、次のエラーがスローされます。
06-05 10:03:35.683: E/AndroidRuntime(9010): Android.database.sqlite.SQLiteException: Can't downgrade database from version 2 to 1
06-05 10:03:35.683: E/AndroidRuntime(9010): at Android.database.sqlite.SQLiteOpenHelper.onDowngrade(SQLiteOpenHelper.Java:361)
結局のところ、フレッシュインストールを行ったので、DBも削除する必要がありました。番号?
バージョンを1に再度変更するにはどうすればよいですか?
この例外は、次の条件でスローされます。
SQLiteOpenHelper
コンストラクターへのパラメーターを使用)onDowngrade()
はコードでオーバーライドされません。フレッシュインストール後、初めてコードが正常に機能したとのことです。同じデータベースファイルのバージョン番号を再び2に上げるコードが他にないことを確認してください。
コードで処理できるよりも高いバージョンのデバイス上のデータベースを使用してアプリケーションを実行できるようにする場合は、onDowngrade()
を独自にオーバーライドできます。
これはonDowngrade()
のデフォルトの実装です。
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
throw new SQLiteException("Can't downgrade database from version " +
oldVersion + " to " + newVersion);
}
このメソッドをオーバーライドする必要がある場合は、 この質問も をお読みください。
そのメソッドをオーバーライドしないと、SQLiteのバージョンを増やして実行した後に減らすことはできません。したがって、2
または2
より大きい値に戻す必要があります。
public DatabaseHelper(Context context) {
super(context, DB_NAME, null, 2);
}
テーブルを更新しようとしている場合、おそらく3
ではなく2
を渡す必要があり、必要なたびにテーブルを更新するには、バージョンを増やす(減らすのではなく)する必要があります。
同じ問題があり、私はこのようにそれを解決しました。
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.setVersion(oldVersion);
}
onDowngrade()はコードでオーバーライドされません。 onDownGrade()を処理する必要があります。
この例外は、データベースをダウングレードする必要があるが、 SQLiteOpenHelper -派生クラスが onDowngradeコールバック を実装していない場合に発生します。
データベースが作成される場所、つまりデータベースのバージョンが通常割り当てられる場所(SQLiteOpenHelper ctorなど)は表示されません。
外部ファイルシステムにデータベースがある可能性はありますか?命名規則に従わない限り、これらのファイルはアプリケーションが削除されても削除されません。
更新:アプリ情報に移動し、>ストレージとクリアデータも機能するはずです。
最初は機能したが2回目は機能しなかった理由のひとつとして、データベースが最初の実行で呼び出されなかったことが考えられます。
また、Marshmallowから、Androidアプリデータは 自動的にバックアップされます。 23以上を対象とするアプリの場合、アプリは知らないうちにクラウドから以前のデータベースを取得できた可能性があります。
残念ながら、アプリのデータを個別に削除することはまだできません。ただし、すべてのアプリのバックアップデータを強制終了してもかまわない場合は、アプリをアンインストールしてから https://myaccount.google.com/dashboard に移動し、Androidセクションを作成し、バックアップされたアプリデータを削除します。
その後、アプリを再インストールして、新しいデータベースを取得できるようになります。
これは私にとってはうまくいきましたが、あなた自身の責任でそうしてください。
新規インストールをどのように実行しましたか?
adb install -r
?その場合、データベースを含むアプリのデータは変更されません。adb uninstall
およびadb install
?これは、クリーンインストールを実行するための正しい方法です。すべてのデータはuninstall
の間に削除され、データベースはinstall
の後の最初の開始後に新たに作成されます。しかし、新規インストール後の最初の起動時に、それは機能したと書いています。これは、どこかでまだバージョン2へのアップグレードを実行していることを意味するだけです。
これは、以前のファイルがすでに存在し、同じ名前で別のファイルを作成しようとしていることを意味します。データベースの名前を変更するか、エミュレートするデバイスでアプリケーションをアンインストールして、再度エミュレートできます。