15

現在のアプリの更新に取り組んでいます。私のアプリは SQLite DB を使用しており、これまでのところバージョン 1 です。2 番目のバージョンで新しいテーブルを変更/導入する必要があります。私は調査を行い、そのための最善の方法は、フォールスルー方式で db を更新するswitch( ) ステートメントを使用することであることがわかりました。case

私の質問は、android は .NET の古いバージョンが何であるかをどのように知るのonUpgrade()ですか? . 実際、いつ呼び出されるのでしょうか。.

したがって、更新されたアプリを初めてダウンロードするユーザーの場合、onUpgrade()は呼び出されないと思います! アンドロイドはいつ電話しないのかをどのように知るのでしょうonUpgrade()か?

これを明確にしてください。初めてのアップデートを送信したいのですが、苦労して獲得したユーザーを失いたくありません :)

4

2 に答える 2

23

を実装するときはSQLiteOpenHelper、バージョン パラメータをスーパークラス コンストラクタに渡します。これは、アプリケーションの将来のバージョンで変更できる静的な値である必要があります (通常、これはSQLiteOpenHelper、スーパークラス コンストラクターに渡すデータベース名と共に、実装の静的な最終属性にする必要があります)。

次に、データベースを更新する場合は、SQLiteOpenHelper実装で使用されるバージョン パラメーターをインクリメントし、実行する予定の SQL 変更をonUpgrade()メソッド内でプログラムで実行します。

DB がバージョン 1 のテーブル A で開始し、バージョン 2 でテーブル B を追加し、バージョン 3 でテーブル C を追加したとします。onUpgrade メソッドは次のようになります。

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < 2) { // do stuff for migrating to version 2
        db.execSQL( ...create table B... );
    }
    if (oldVersion < 3) { // do stuff for migrating to version 3
        db.execSQL( ...create table C... );
    }
}

スーパークラス コンストラクターが実行されると、格納されている SQLite .db ファイルのバージョンと、パラメーターとして渡されたバージョンが比較されます。それらが異なる場合、onUpgrade()呼び出されます。

実装を確認する必要がありますが、データベースを作成する必要がある場合にonUpgrade()も呼び出されると思いonCreate()ます。すべてのアップグレードを確実に実行する方法があります (たとえば、すべてのバージョン番号を正の整数に強制し、新しく初期化することによって)。バージョン 0 で作成されたデータベース)。

于 2013-01-17T02:12:45.387 に答える
4

onUpgrade()コンストラクターからは呼び出されません。初めてgetWritableDatabase()呼び出されると、データベースが開かれonCreate()onUpgrade()および/またはonOpen()呼び出されます。getWritableDatabase()そのため、コンストラクターはメイン スレッドにありますが、ワーカー スレッドから呼び出す方がパフォーマンスが向上します。

于 2016-06-03T18:04:29.410 に答える