0

既存の Plist に新しいエンティティを追加しました。Plist の不一致により、新しいバージョンのアプリがクラッシュします。

古い plist データを新しい plist とマージするにはどうすればよいですか?

私のPlist作成方法は以下の通りです

- (void)createEditableCopyOfFileIfNeeded:(NSString *)plistName
{
    // First, test for existence.
    BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:plistName];
    success = [fileManager fileExistsAtPath:plistPath];
    if (success)
    {
        return;
    }
    // The writable database does not exist, so copy the default to the appropriate location.
    NSString *defaultPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:plistName];
    success = [fileManager copyItemAtPath:defaultPath toPath:plistPath error:&error];
    if (!success)
    {
        NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
    }
}

前もって感謝します

4

2 に答える 2

2

アプリケーションのバージョンと比較するために、plist にバージョンキーを含めます。次のスニペットを使用して、アプリケーションのバージョンを確認できます。

 [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]

次に、アプリケーションの起動時に:

  1. plist を読んで、バージョンキーがない場合は古いバージョンになります。
  2. 古いバージョンの場合は、現在のバージョンへのデータ移行を実行し、存在しないキーをデフォルト値で追加します。ここでは、将来の更新のために異なるバージョン番号を考慮に入れます。
  3. バンドルのバージョンを値としてバージョンキーを追加します。
  4. plist を保存します。
于 2012-10-08T09:36:47.873 に答える
0

次の方法で実行できます。

  1. 古い plist の名前を変更します。例: old.plist
  2. 別々のファイルから両方の plist を読み取る
  3. 必要な情報をマージして、選択した情報をプログラムで新しい plist に追加します
  4. 新しい plist をマージして保存
于 2012-10-08T09:17:31.167 に答える