2017-10-19 5 views
2

私は1つのテーブルを持つデータベースを持つアプリケーションを持っています。私はデータベースに新しいテーブルを含む大きなアップデートを出したいと思っています。SQLiteデータベースのonUpgradeメソッドを少し説明したいです

私は成功した私の質問は素晴らしいものではないかもしれません

。ONUPGRADE方法で「db.execSQL(SQL_CREATE_STRING」を行うことによって、古いデータベースに新しいテーブルを作成するために、ONUPGRADEメソッドを使用...しかし、それはです私は答えを見つけることができません

次回、データベースをアップグレードする前に、データベースのバージョンは2、データベースのバージョンは3、データベースのバージョンは3です。私はまだ別のテーブルを追加したいのですか?現在の "db.execSQL(SQL_CREATE_STRING"をonUpgradeに残すか、最初に削除する必要がありますか?)

SQL_CREATE_STRINGは "CREATE TABLE IF NOT EXISTS"で始まるので、私はonUpgradeメソッドにそのまま置くことができますか?既にテーブルが存在すると既に存在するので、別のテーブルを作成しようとはしません。

私はこの考えを確認しようとしています。

ありがとうございます!

+0

興味のある[別のアプローチ](https://stackoverflow.com/questions/46339534/android-sqlite-detect-if-new-version-not-found/46342520#46342520)があります。少し長めになっていますが、 'onUpgrade'を使わずにテーブル/カラム/インデックスを追加することができます。私のために働く。 – MikeT

答えて

3

SQL_CREATE_STRINGは「CREATE TABLE IF NOT EXISTS」で始まるので、私はonUpgradeメソッドにそのまま置くことができますか?既にテーブルが存在すると既に存在するので、別のテーブルを作成しようとはしません。

それは正しいと思います。しかし、いくつかのバージョンを追加することを開始した場合は、更新が関係なく実行されるかどうかを把握するのが難しいかもしれません。

私がお勧めするのは、それぞれのアップグレード手順を独自の方法で行い、指定されたアップグレード呼び出しに必要なものすべてを順番に実行することです。たとえば、次のようになります。

public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) { 
    for(int i = oldVersion + 1; i < newVersion; i++) { 
     switch(i) { 
     case 2: upgradeFromv1Tov2(); break; 
     case 3: upgradeFromv2Tov3(); break; 
     ... 
    } 
} 

v1からv3にアップグレードすると、v1→v2、次にv2→v3ロジックが実行されます。このようにすると、各アップグレード手順を作成するときに、データベーススキーマの状態(つまり以前のバージョン)を正確に把握できるので、すべてのアップグレード手順間のやりとりを同時に心配する必要はありません。

関連する問題