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

J'ai la structure de plist suivante.Comment UPDATE et SUPPRIMER des éléments de chaîne et des éléments de dictionnaire entiers à partir d'une plist

Q1 Comment mettre à jour/changer fullName dans le code après qu'il a déjà été enregistré dans le fichier plist?

Q2 Comment supprimer un seul élément de dictionnaire dans l'exemple ci-dessus Point 0? J'utilise le TableView du contrôleur de navigation avec l'exemple de détail.

Merci

+0

Merci pour avoir corrigé le formatage. Je lis "Code et texte préformaté" en ce moment même. –

Répondre

4

Vous ne vraiment pas de mettre à jour ou supprimer un formulaire le fichier plist. Il est un peu plus compliqué que cela:

  1. Lire le fichier plist dans la mémoire
  2. Alter l'en mémoire la version
  3. Ecrire la nouvelle version de retour sur le disque

lecture dans un plist est assez trivial. Dans votre cas, étant donné que l'élément racine est un tableau, vous feriez:

NSMutableArray * plistContents = [NSMutableArray arrayWithContentsOfFile:plistFilePath]; 

Ici, nous créons un tableau mutable, puisque nous savons que nous allons changer des choses en elle. Si nous voulions juste lire l'information, nous devrions utiliser NSArray au lieu de NSMutableArray.

Modifier la version en mémoire est aussi simple que la manipulation de conteneurs standard:

//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]; 

Ici, nous devons faire une copie mutable (modifiable) du dictionnaire, puisque la lecture dans un plist ne crée que l'NSDictionary immuable . Nous avons donc copié le dictionnaire, modifié la valeur que nous voulons changer, puis remplacé le dictionnaire original par notre nouveau dictionnaire modifié.

La rédaction du plist sur le disque est aussi simple:

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

Merci Dave. Je vais essayer ça demain, il est 4 heures du matin et je suis sûr que les enfants vont me réveiller à 6 ans. Vos informations sont très instructives et bien pensées. –

+0

Je mets [plistContents writeToFile: plistFilePath atomiquement: YES]; dans mon ViewDidDisappear et cela fonctionne très bien. Merci. Maintenant, je dois juste faire fonctionner la mise à jour. La mise à jour se passe dans la vue des détails, mais avec ce que vous m'avez donné je pense que je peux comprendre. –

1

Vous ne fonctionnent pas sur les données stockées dans un fichier plist directement, vous sérialiser des objets ou des objets à unserialize d'un plist. Puisque vous voulez modifier les données, vous devez désérialiser les objets mutables. NSPropertyListSerialization 's propertyListWithData:options:format:error: va désérialiser un plist créant des collections mutables lorsque vous utilisez l'option NSPropertyListMutableContainers ou NSPropertyListMutableContainersAndLeaves.

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]; 

Cela vous obtiendrez une collection imbriquée de NSMutableArray s, NSMutableDictionary s, soit NSString s ou NSMutableString s (selon que vous avez spécifié NSPropertyListMutableContainers ou NSPropertyListMutableContainersAndLeaves) & c. Après avoir désérialisé le plist, utilisez la méthode fournie par la collection (par exemple, removeObjectAtIndex:, NSMutableDictionaryremoveObjectForKey:) ou définissez les articles (par exemple replaceObjectAtIndex:withObject:, setObject:forKey:). Pour plus d'informations, veuillez lire le Property List Programming Guide.

+0

+1 pour l'utilisation de l'option des conteneurs modifiables. Je ne me souviens jamais que ça existe :) –