2011-02-09 8 views
1

CoreData for storageを使用しているiPhoneアプリケーションがあります。iPhone CoreDataデータのマイグレーション

永続ストア(sqlite3データベース)には、データが移入された複数のエンティティが含まれています。これらのデータは、アプリケーション内のさまざまなメニューとオプションを作成するために使用されます。これらのデータを「アプリケーションデータ」と呼ぶことにしましょう。

その他のエンティティは、アプリケーションによってユーザーデータを格納するために使用されます。

スキーマはほとんど変更されませんが、アプリケーションデータを更新してユーザーに新しいオプションを提供する必要があることがよくあります。

大量のCSVファイルから新しいデータを取得し、開発マシンでsqlite3データベースを更新するMacRubyスクリプトがありますが、既存のデプロイ済みアプリケーションを新しいアプリケーションデータで更新するにはどうすればよいか分かりません(スキーマの変更がないことを覚えておいてください)。

アイデア?

_ 更新 _

思考のビットの後、私は新しいデータが含まれているウェブサーバから新しいsqlite3のファイルをダウンロードするためのアプリケーションを設定することを志向取得しています。受信したアプリケーションは、更新データsqlite3ファイルのデータをアプリケーションの作業データベースファイルにコピーし、アプリケーションデータを完全に置き換えますが、ユーザーデータには触れません。

更新プログラムが適用されているかどうかを判断するメカニズムでは、アプリケーションが定期的にダウンロードする単一のデータベースバージョン番号を持つテキストファイルを使用できます。この番号が前回の更新の番号(ローカルに保存されている番号)より大きい場合は更新が進み、それ以外の場合は無視されます。

+0

こんにちはFutureshocked、答えを見つけましたか?私も同じ問題に直面しています。 DefaultValuesというエンティティがあります。これは、他のエンティティに存在するユーザーデータに触れることなく、いくつかの新しいレコードで更新したいものです。正確に私は何をしなければならないのか分からないのですか? –

+0

私はこれをまだ終わらせていませんが、私が従う予定の戦略は、新しいデータをsqlite3ファイルにバンドルすることです(これは問題ではありませんが、単純なjsonファイルでもかまいません)。アプリで開くと、必要に応じてアプリ独自のデータベースにデータがコピーされます。お役に立てれば。私は携帯電話でsqlite3ファイルをダウンロードする部分を実装して、時間が足りません:-( – futureshocked

答えて

0

sqlite3ストアに新しいエントリを追加することについて話しているのであれば、アプリケーションの起動時にこれを実行できない理由はありますか?私はこれを自分で行う必要はありませんでしたが、挿入が必要なデータを含むプロパティリストを作成してアプリケーションの起動時に更新を実行できない理由はわかりません。

NSString *applicationDataPath = [[NSBundle mainBundle] pathForResource:@"ApplicationData" ofType:@"plist"]; 
NSString *previousVersion = [[NSUserDefaults standardUserDefaults] stringForKey:@"VERSION"]; 

NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; 

/* Don't bother processing updates if the version last run is the same as the current version. */ 
if (! [previousVersion isEqualToString:currentVersion]) 
{ 
    NSArray *versionList = [applicationData objectForKey:@"Versions"]; 

    BOOL process = (nil == previousVersion); 
    for (NSDictionary *versionData in versionList) 
    { 
    NSString *version = [versionData objectForKey:@"version"]; 
    if (process) 
    { 
     // Send dictionary for this version update to some method to process it.. 
     [self processUpdate:versionData]; 
    } 

    if (!process && [version isEqualToString:previousVersion]) 
     process = YES; 
    } 
}  

アイデアのplistは、アプリケーションの各バージョンと、このバージョンに更新する必要があり、データを記述辞書の配列を含んでいることです。私は以下のplistの例は、必要な詳細が欠けているので、アイデアを得るためのスタブです。

また、コードが実際に動作するかどうかは考えられません;あなたの問題を正しく理解していると仮定した場合、同じことに対処しなければならないと思います。

これは、データが更新された後のアプリの起動時にユーザーデフォルトに保存されていた以前のバージョンを更新して、1回だけ実行するようにしたいことにも注意してください。

[{ バージョン=( { データ= { 1 = { エンティティ=メニュー; }; }; バージョン= "1.1"; }、 { データ= { 1 = { エンティティ=メニュー; }; }; バージョン= "1。2" ; }、 { データ= { 1 = { エンティティ=メニュー; }; }; バージョン= "1.3"; }、 { データ= { 1 = { エンティティ=メニュー; }; }; バージョン= "2.0"; }、{ データ= { 1 = { エンティティ=メニュー; }; }; バージョン= "2.5"。 } ); }]

+0

ありがとうマイク、これは私の状況に正確に一致していません。私はsqlite3データベースを私のアプリケーションでCoreDataによって永続化に使用しています。 〜4MBであり、ユーザーデータを保持するテーブルとアプリケーションデータを保持するテーブルの2つのセットがあります.DBの大部分はアプリケーションデータです。これは新しいセットで置き換える必要がありますユーザデータに影響を与えることなく)。 – futureshocked

関連する問題