3

Android の SQLite データベースに問題があります。

SQLiteOpenHelper クラスの onCreate(SQLiteDatabase db) メソッドで、テーブルを作成しています。これで、このアプリケーションがプレイストアにアップロードされました。ここで、これらのテーブルにもう 1 つの列が必要であると考えました。

アプリケーションの更新をプレイストアに入れると (onCreate() メソッドで新しいクエリを使用)、次回は OnUpgrade() メソッドが呼び出されるため、テーブルが再度作成されることはありません。

アプリケーションの再インストールまたは更新時に SQLite データベースを削除する方法はありますか? または、再インストールする前にアプリケーション全体を削除しますか?

4

4 に答える 4

13

1. onCreate() と onUpdate() について

onCreate(..) は、アプリが新しくインストールされるたびに呼び出されます。onUpgrade は、アプリがアップグレードされて起動され、データベースのバージョンが同じでない場合に呼び出されます。

次のようなコンストラクタが必要です。

2. db バージョンのインクリメント

MyOpenHelper(Context context) {
super(context, "dbname", null, 2);
}

重要: onUpgrade を呼び出すには、アプリのバージョンを増やすだけでは不十分です。

3. 新しいユーザーのことを忘れないでください!

追加することを忘れないでください

database.execSQL(DATABASE_CREATE_color);

onCreate() メソッドに追加しないと、新しくインストールされたアプリにテーブルがありません。

4. 時間の経過とともに複数のデータベースの変更に対処する方法

アプリのアップグレードが連続しており、そのうちのいくつかにデータベースのアップグレードがある場合は、必ず oldVersion を確認する必要があります。

onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   switch(oldVersion) {
   case 1:
       db.execSQL(DATABASE_CREATE_color);
       // we want both updates, so no break statement here...
   case 2:
       db.execSQL(DATABASE_CREATE_someothertable); 
   }
}

このようにして、ユーザーがバージョン 1 からバージョン 3 にアップグレードすると、両方の更新が取得されます。ユーザーがバージョン 2 から 3 にアップグレードすると、リビジョン 3 の更新プログラムを取得するだけです... 結局、更新をリリースするたびに、ユーザー ベースの 100% がアップグレードされるとは期待できません。更新または12をスキップすることがあります:)

うまくいけば、これは理にかなっています。

5. 開発中にリビジョン番号を管理する

そして最後に...呼び出し

adb uninstall <yourpackagename>

アプリを完全にアンインストールします。再度インストールすると、onCreate メソッドをヒットすることが保証されます。これにより、データベースのバージョンを成層圏にインクリメントし続ける必要がなくなります...

于 2013-01-29T09:17:58.933 に答える
2

私の理解では、列を 1 つだけ追加する必要があります。
あなたはで試すことができます

Alter table

参照 - http://www.sqlite.org/lang_altertable.html

于 2013-01-29T09:12:17.273 に答える
0

これは最善の解決策ではないかもしれませんが、探している列を選択してテーブル スキーマを比較するコードを作成しました。

そこにない場合は例外が発生し、テーブルを削除/再作成します。次回アプリを実行すると、列がそこにあるため、選択は正常に機能します。その理想は定かではありませんが、うまくいきます。

于 2013-01-29T09:19:30.820 に答える
0

onCreate(SQLiteDatabase db)は、データベースが初めて作成されたときにのみ呼び出されます。既存のテーブルへのアップグレードを処理する場合は、onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)を使用する必要があります。具体的には、oldVersion から newVersion への移行パスを処理します

于 2013-01-29T09:16:47.487 に答える