2017-03-28 3 views
0

現在、私はそういう表を作成しています。iOS/SQL:欠落している列を追加する/欠けている列をアプリの更新後にテーブルに自動的に削除しますか?

[self.fmDataBase executeUpdate:@"create table test (id integer primary key autoincrement, test text);"]; 

これはうまくいきますが、将来はテーブルの列がさらに必要になります。そうそうだ。

[self.fmDataBase executeUpdate:@"create table test (id integer primary key autoincrement, test text, test1 text);"]; 

状況をどのように処理するかは完全にはわかりません。時間が経つにつれて、列を追加したり、列を削除したり、列の名前を変更したりする必要があります。私はこの

if (version_1.1) { 
    [self.fmDataBase executeUpdate:@"alter table test add test1 text"]; 
    } else if (version_1.2) { 
    [self.fmDataBase executeUpdate:@"alter table test add test2 text"]; 
    } else if (version_1.3) { 
    [self.fmDataBase executeUpdate:@"alter table test add test3 text"]; 
    } 

それとも何とかクエリを比較すると、自動的に変更を加えることにより、これを回避する方法があるような何かをしたとしていますか?私は、ユーザーがアプリケーションを更新するときにアプリケーションが壊れないことを確認したい。これまでのように、私は手動で各アプリケーションのバージョンごとに更新する必要があります。

+2

ユーザーはいくつかの更新をスキップして、複数のバージョンから最新のバージョンへの更新を処理する必要があることに注意してください。 – rmaddy

+0

http://stackoverflow.com/questions/21414930/ios-method-on-app-updateおよびhttp://stackoverflow.com/questions/7347455/ios-rolling-out-app-updates-keeping-user- data-intact-db-update-required?s = 1 | 1.1056 – rmaddy

+0

@rmaddy。それは本当です。いつでもデータベースを変更するように思えますが、以前のバージョンがまだ正しく動作していることを確認する必要があります。たとえば、ユーザーが1.1から1.3に移行した場合、if文を変更してtest 2とtest 3の列も含めなければなりません。私の状況で多くの複雑化を避ける最良の解決策のように思えるのは、最後の2つのバージョンに追いつくことです。それより古いすべてのバージョンでは、dbを削除してユーザーのログインと再同期のデータを作成します。ほとんどのユーザーは前の2つのバージョンを使用しているようですので、大多数を満足させます。それは良いアイデアですか? – Weakman10122

答えて

0

私は実際にFMDBについて知りませんが、CoreDataを使用すると自動的にこれを処理します。データモデルの各バージョンのレコードがあれば、起動時にデータベースの以前のバージョンの前のバージョンを移行します。

あなたが永続ストアコーディネーターを初期化、それにこれらのフラグを与える:データベース内の単純な増加(例えば、テーブルとフィールドを追加/削除、ないリレーショナルもの)については

NSDictionary *migrationOptions [email protected]{NSMigratePersistentStoresAutomaticallyOption:@(YES), 
            NSInferMappingModelAutomaticallyOption:@(YES)}; 

を、これは十分であり、完璧に動作します。

関連する問題