1
Root ---- Array 
    Item 0- Dictionary 
    fullName ---- String 
    address ---- String 
    Item 1 ---- Dictionary 
    fullName ---- String 
    address ---- String 

私は以下のplist構造を持っています。plistから文字列アイテムと辞書アイテム全体を更新および削除する方法

Q1 plistファイルに既に保存されているコードのfullNameを更新/変更するにはどうすればよいですか?

Q2上記の項目0の例のように、1つの辞書項目を削除するにはどうすればよいですか?

私は、ナビゲーションコントローラTableViewと詳細例を使用しています。

ありがとうございました

+0

フォーマットを修正していただきありがとうございます。私が話しているように、私は「コードと書式設定されたテキスト」を読んでいます。 –

答えて

4

実際にplistファイルから何かを更新したり削除したりすることはありません。それは少しより複雑なものよります:

  1. アルターは、インメモリ版
  2. のplistに

読書ディスクへの新しいバージョンをライトバックメモリにplistファイルを読みますかなり些細なことです。あなたのケースでは、ルート要素が配列であるため、あなたがしたい:私たちはそれで何かを変えることになるだろう知っているので、ここで

NSMutableArray * plistContents = [NSMutableArray arrayWithContentsOfFile:plistFilePath]; 

我々は、可変配列を作成します。情報を読みたいだけの場合は、NSMutableArrayの代わりにNSArrayを使用してください。メモリ内のバージョンを変更

は標準コンテナを操作するのと同じくらい簡単です:

//delete the first dictionary: 
[plistContents removeObjectAtIndex:0]; 

//Change a dictionary's full name: 
NSMutableDictionary * firstDictionary = [[plistContents objectsAtIndex:0] mutableCopy]; 
[firstDictionary setObject:@"Mike" forKey:@"fullName"]; 
[plistContents replaceObjectAtIndex:0 withObject:firstDictionary]; 
[firstDictionary release]; 

plistの中で読むことのみ不変を作成しますので、ここでは、辞書の可変(変更可能)コピーを作成する必要がNSDictionary 。そこで、辞書をコピーし、変更したい値を変更して元の辞書を新しい変更済みの辞書に置き換えます。

ディスクへのplistを書くも簡単です:

//be sure you have write-permissions first! 
[plistContents writeToFile:plistFilePath atomically:YES]; 
+0

ありがとうございました。私は明日これを試してみます、それは午前4時の東部です。私は子供たちが6時に私を目覚めさせてくれると確信しています。あなたの情報はとても有益であり、よく考えられています。 –

+0

私は[plistContents writeToFile:plistFilePath atomically:YES]を入力します。私のViewDidDisappearでそれは素晴らしい作品です。ありがとう。今は、アップデートを動作させるだけです。更新は詳細ビューで行われますが、私に与えたものではわかります。 –

1

あなたがPLISTからオブジェクトまたはアンシリアライズオブジェクトをシリアライズ、直接plistの中に格納されたデータに動作しません。データを変更したいので、変更可能なオブジェクトにシリアル化を解除する必要があります。 NSPropertyListSerializationpropertyListWithData:options:format:error:は、NSPropertyListMutableContainersまたはNSPropertyListMutableContainersAndLeavesオプションを使用すると、変更可能なコレクションを作成するplistをシリアル化しません。

NSError *err=nil; 
NSData *raw = [[NSData alloc] initWithContentsOfFile:path]; 
id stuff = [NSPropertyListSerialization 
        propertyListWithData:raw 
           options:NSPropertyListMutableContainers 
           format:NULL 
            error:&err; 
     ]; 
if (err) { 
    // couldn't parse the plist; handle the error. 
    ... 
    [err release]; 
} 
[raw release]; 

これは& C(あなたがNSPropertyListMutableContainersNSPropertyListMutableContainersAndLeavesを指定したかどうかに応じて)あなたにNSMutableArray秒、NSMutableDictionaryの、いずれかNSString SまたはNSMutableString秒のネストされたコレクションを取得します。 plistをシリアライズした後、コレクションに含まれている方法(例:NSMutableArrayremoveObjectAtIndex:NSMutableDictionaryremoveObjectForKey:)を使用するか、(たとえばreplaceObjectAtIndex:withObject:,setObject:forKey:)のアイテムを設定します。

詳細については、Property List Programming Guideをご覧ください。

+0

可変容器オプションを使用する場合+1。私は存在することを忘れない:) –

関連する問題