2

別のプログラムで作成し、アプリケーションの起動時にコピーされる資産フォルダーに含める SQLite データベースがあるとします (まだ存在しないと仮定します)。データベースには A と B の 2 つの列が含まれています。たとえば、A には場所のリスト (パリ、ロンドン、ニューヨークなど、ユーザーが編集できないもの) が含まれ、B にはユーザーがそれぞれの場所を訪れた回数が格納されているとします。 (ユーザーはアプリ内から編集できます)。

ここで、元のデータベースで場所の名前のスペルを間違えたとしましょう。SQLite ブラウザーにアクセスし、そのエントリをすばやく修正して保存し、assets フォルダー内の古い DB ファイルを置き換えます。既にコピーされているデータベースの列 A を更新して、保存されているデータを消去せずに、資産フォルダー内の現在読み取り専用のデータベースに加えた変更を反映するにはどうすればよいですか?

私の最初の印象は onUpgrade を使用することでしたが、データベースのスキーマを更新するためだけに使用するという人もいます。この場合、スキーマは変更されておらず、スキーマ内の一部のデータのみが変更されています...

4

2 に答える 2

2

最初から始めましょう. コンストラクタ SQLiteOpenHelper でデータベースを開くと、バージョン情報が取得されます。

データベースが存在しない場合は、onCreate メソッドを呼び出します。既存のデータベースのバージョンが自分のバージョンより低い場合、onUpgrade メソッドが呼び出されます。

詳細については、 Androidのドキュメントをお読みください。

そのため、onCreate メソッドに初期情報を挿入できます。また、onUpgrade メソッドで、テーブルを変更したり、追加情報をテーブルに挿入したりできます。

それが役に立てば幸い..

于 2012-06-12T05:51:24.773 に答える
1

onUpgrade必要なものに使用するのが正しいです。アップグレード中にスキーマと静的データの両方を更新します。私のonUpgradeは次のように構成されています:

@Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
        if (oldVersion < 211)
        {
            // In this version we transfer Log data into new date keeping format - just milliseconds, no string formatting
            db.execSQL("DROP TABLE IF EXISTS " + LogData.TABLE_NAME);
            db.execSQL(LogData.TABLE_CREATE_SQL);
            logInformation(db, "Application upgraded to 2.1.1 level and existing log data cleared from device.");
        }

        if (oldVersion < 212)
        {
        }

        if (oldVersion < 220)
        {
            db.execSQL("DROP TABLE IF EXISTS " + MailData.MAIL_TABLE_NAME);
        }
    }
于 2012-06-12T05:46:50.097 に答える