2010-09-14 6 views
1

J'ai écrit un code qui extrait des informations d'un fichier plist et fait un certain nombre de choses, puis finit par faire apparaître ces données dans une table. Cela fonctionne très bien, le problème est que j'ai écrit le code en tirant les données d'un fichier plist dans le dossier des ressources, mais le fichier réel sera créé via une action et stocké en mémoire. J'ai besoin d'aide pour faire fonctionner mon code en le tirant du nouvel emplacement.Fichiers de dictionnaire et de plist

Code de travail actuel:

- (void) loadData{ 
// Load items 
NSString *error; 
NSPropertyListFormat format; 
NSString *path = [[NSBundle mainBundle] pathForResource:@"CalculatorData" ofType:@"plist"]; 
NSData *plistData = [NSData dataWithContentsOfFile:path]; 
NSArray *amountData = [NSPropertyListSerialization propertyListFromData:plistData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&error]; 
NSDictionary *amountData = [NSPropertyListSerialization propertyListFromData:plistData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&error]; 

if (amountData) { 
    self.amounts = [[NSMutableArray alloc] initWithCapacity:[amountData count]]; 
    result = 0; 
    for (NSDictionary *amountsDictionary in amountData) { 

     [self.amounts addObject:amountsDictionary]; 

     currentNumber = [[amountsDictionary objectForKey:@"Value"] floatValue]; 

     if ([[amountsDictionary objectForKey:@"Type"] isEqualToString:@"Plus"]) { 
      result = result + currentNumber; 
     } else { 
      result = result - currentNumber; 
     } 
    } 
    //Set main amount 
    NSString *msg = [NSString stringWithFormat:@"£%.2f",result]; 
    [lblAmount setText:msg]; 
} else { 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"Why not keep track of your income and expensies? Add new items below." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 
} 
} 

Je pense que pour tirer les informations du nouvel emplacement du fichier que j'ai besoin quelque chose de similaire au-dessous, mais ne peut pas sembler obtenir la sortie comme ci-dessus:

//Get file location 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"saveBudget.plist"]; 

// read it back in with different dictionary variable 
NSMutableDictionary *amountData = [NSMutableDictionary dictionaryWithContentsOfFile:path]; 
if(amountData==nil){ 
    NSLog(@"failed to retrieve dictionary from disk"); 
} else { 
    NSLog(@"%@", amountData); 
} 

le code création du fichier plist est (ce qui a besoin d'un peu écrasant travail, comme actuellement aussi toujours ce qui a été fait avant, quand je le voudrais ajouter un nouveau tableau):

-(void) addData { 

// create a dictionary to store a fruit's characteristics 
NSMutableDictionary *items = [[NSMutableDictionary alloc] init]; 
[items setObject:@"10" forKey:@"Value"]; 
[items setObject:@"tester" forKey:@"Description"]; 
[items setObject:@"Plus" forKey:@"Type"]; 

// create a dictionary to store all fruits 
NSMutableDictionary *plist = [[NSMutableDictionary alloc] init]; 
[plist setObject:items forKey:@"0"]; 

//Get file location 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"saveBudget.plist"]; 

// write plist to disk 
[plist writeToFile:path atomically:YES]; 
} 

Cela aussi besoin d'un peu de travail que je voudrais que ce soit:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<array> 
    <dict> 
     <key>Date</key> 
     <string>27/9/10</string> 
     <key>Value</key> 
     <string>10.97</string> 
     <key>Description</key> 
     <string>PaperRound</string> 
     <key>Type</key> 
     <string>Plus</string> 
    </dict> 
    <dict> 
     <key>Date</key> 
     <string>27/9/10</string> 
     <key>Value</key> 
     <string>10.97</string> 
     <key>Description</key> 
     <string>PaperRound</string> 
     <key>Type</key> 
     <string>Plus</string> 
    </dict> 
    <dict> 
     <key>Date</key> 
     <string>27/9/10</string> 
     <key>Value</key> 
     <string>10.97</string> 
     <key>Description</key> 
     <string>PaperRound</string> 
     <key>Type</key> 
     <string>Plus</string> 
    </dict> 
    <dict> 
     <key>Date</key> 
     <string>27/9/10</string> 
     <key>Value</key> 
     <string>10.97</string> 
     <key>Description</key> 
     <string>PaperRound</string> 
     <key>Type</key> 
     <string>Plus</string> 
    </dict> 
</array> 
</plist> 

Désolé pour le long post, mais devrait, espérons-être tout ce qui se rapporte. Toute aide sur ce serait génial.

Répondre

1

Si vous voulez que l'élément le plus externe de la plist être un tableau, puis les lignes suivantes dans le code affiché sont la création d'un objet du mauvais type:

// create a dictionary to store all fruits 
NSMutableDictionary *plist = [[NSMutableDictionary alloc] init]; 
[plist setObject:items forKey:@"0"]; 

Je voudrais aussi méfiez-vous de laisser rassis des commentaires dans votre code, car ils peuvent parfois vous induire en erreur. Voici une réécriture suggéré de votre méthode addData:

-(void)addData { 

    // Create a dictionary representing an item 
    // 
    NSDictionary *item = [NSDictionary dictionaryWithObjectsAndKeys: 
          @"10", @"Value", 
          @"tester", @"Description", 
          @"Plus", @"Type", 
          nil]; 

    // Create an array of items. This must be an instance of NSArray or 
    // NSMutableArray if you want the corresponding element in your plist 
    // to be an array. 
    // 
    NSArray *items = [NSArray arrayWithObjects: item, nil]; 

    // Get file location (this part is fine). 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"saveBudget.plist"]; 

    // Write array of items to filesystem 
    [items writeToFile:path atomically:YES]; 
} 

Avec mes excuses, je n'ai pas testé le code ci-dessus, mais il devrait au moins servir à illustrer le point.

+0

Salut Jlehr, merci pour cela, les choses simples aident tellement! Une dernière chose cependant, comment puis-je ajouter au tableau, ne pas remplacer? Actuellement, lorsqu'un nouvel élément est ajouté, il écrase celui en cours? – jimbo

+0

J'ai réussi à le résoudre, en lisant les données d'abord puis en ajoutant le nouvel élément (addObject) à celui-ci cela fonctionne ... – jimbo

+0

Salut jimbo, désolé je ne l'ai pas vu plus tôt. C'est vrai, pour ajouter des objets à la fin d'un tableau, vous pouvez utiliser '-addObject:'; Si vous voulez insérer ailleurs dans le tableau, utilisez '-insertObject: atIndex:'. – jlehr

Questions connexes