web-dev-qa-db-ja.com

新規インストールして再実行した後でも、データベースをバージョン2から1にダウングレードできません

私は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に再度変更するにはどうすればよいですか?

11
Elad Benda2

この例外は、次の条件でスローされます。

  • コードを実行しているデバイスには、バージョン2のデータベースファイルがあります。
  • コードはデータベースのバージョン1を要求しています(SQLiteOpenHelperコンストラクターへのパラメーターを使用)
  • onDowngrade()はコードでオーバーライドされません。

フレッシュインストール後、初めてコードが正常に機能したとのことです。同じデータベースファイルのバージョン番号を再び2に上げるコードが他にないことを確認してください。

18
laalto

コードで処理できるよりも高いバージョンのデバイス上のデータベースを使用してアプリケーションを実行できるようにする場合は、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を渡す必要があり、必要なたびにテーブルを更新するには、バージョンを増やす(減らすのではなく)する必要があります。

1
Blasanka

同じ問題があり、私はこのようにそれを解決しました。

@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  db.setVersion(oldVersion);
}
1

onDowngrade()はコードでオーバーライドされません。 onDownGrade()を処理する必要があります。

0
Brahem Mohamed

AndroidDeviceFileExplorerからsqlitedbファイルをダウンロードします

[データ/データ/パッケージ名/データベース]

DB Browser for SQLite)を使用してファイルを開きます

gotoプラグマタブを編集し、dbバージョンをユーザーバージョンからダウングレードします

最後にファイルを保存してDeviceFileExplorerにアップロードします

enter image description here

0
23shumon

この例外は、データベースをダウングレードする必要があるが、 SQLiteOpenHelper -派生クラスが onDowngradeコールバック を実装していない場合に発生します。

0
CL.

データベースが作成される場所、つまりデータベースのバージョンが通常割り当てられる場所(SQLiteOpenHelper ctorなど)は表示されません。

外部ファイルシステムにデータベースがある可能性はありますか?命名規則に従わない限り、これらのファイルはアプリケーションが削除されても削除されません。

0
guycole

更新:アプリ情報に移動し、>ストレージとクリアデータも機能するはずです。

最初は機能したが2回目は機能しなかった理由のひとつとして、データベースが最初の実行で呼び出されなかったことが考えられます。

また、Marshmallowから、Androidアプリデータは 自動的にバックアップされます。 23以上を対象とするアプリの場合、アプリは知らないうちにクラウドから以前のデータベースを取得できた可能性があります。

残念ながら、アプリのデータを個別に削除することはまだできません。ただし、すべてのアプリのバックアップデータを強制終了してもかまわない場合は、アプリをアンインストールしてから https://myaccount.google.com/dashboard に移動し、Androidセクションを作成し、バックアップされたアプリデータを削除します。

その後、アプリを再インストールして、新しいデータベースを取得できるようになります。

これは私にとってはうまくいきましたが、あなた自身の責任でそうしてください。

0
Dittimon

新規インストールをどのように実行しましたか?

  • adb install -r?その場合、データベースを含むアプリのデータは変更されません。
  • adb uninstallおよびadb install?これは、クリーンインストールを実行するための正しい方法です。すべてのデータはuninstallの間に削除され、データベースはinstallの後の最初の開始後に新たに作成されます。

しかし、新規インストール後の最初の起動時に、それは機能したと書いています。これは、どこかでまだバージョン2へのアップグレードを実行していることを意味するだけです。

0
msal

これは、以前のファイルがすでに存在し、同じ名前で別のファイルを作成しようとしていることを意味します。データベースの名前を変更するか、エミュレートするデバイスでアプリケーションをアンインストールして、再度エミュレートできます。

0
H.Josue