SQLiteOpenHelper
に基づいてデータベースを更新していますが、それをアップグレードするにはいくつかのバージョンとコードがあり、正常に動作します。しかし、ユーザーが古いバージョンのアプリケーションをインストールした場合(低いデータベースバージョンが必要な場合)、クラッシュする可能性があります。ContentProvider
は、データベースにアクセスできません。私はそれがクラッシュするのを防ぎたいのですが、実際にはデータベースをダウングレードしたくありません。それを行うためのコードを追加することは苦労でしょう。すべてのテーブルを削除することは間違いなく機能しますが、新しいファイルから始めることは、より洗練されたエラーの発生が少ないことです。SQLiteOpenHelper.onDowngrade()のデータベースファイルを削除するためのスキーマが良好です
- は外からそれを実行します:キャッチ例外で
public class MyDbHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 3; private static final String DATABASE_NAME = "my.db"; public MyDbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { onUpgrade(db, 0, DATABASE_VERSION); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (newVersion < 1) db.execSQL("CREATE TABLE A..."); if (newVersion < 2) db.execSQL("CREATE TABLE B..."); if (newVersion < 3) db.execSQL("CREATE TABLE C..."); } @Override public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { // I'd like to delete the database here // the only problem is that I can't from here // since this is called in the middle of getWritableDatabase() // and SQLiteDatabase has no .recreate() method. } }
ある私がやって作ってみた可能性のある方法
何も特別な - データベースヘルパーがどのようなものかについてですContentProvider
、ファイルを削除し、データベースを再度開くように要求します。 - それはプロバイダの責任ではないので、私はそれが好きではありません。代わりにonDowngrade
呼び出しのファイルを削除し、そのクラスの私自身のコピーでSQLiteOpenHelper
の交換 - - 問題は、それは私があまりにも
SQLiteDatabase
を複製せずに置き換えることはできませんSQLiteDatabase
(例えば.lock()
)のパッケージプライベートの部分を使用してということです(それはおそらくしまいますsqliteスタック全体を複製する際に)。
これを行うには良い方法がありますか、またはDROP TABLES
などの方法で行ってください。 like here?