2009-10-31 5 views
0

Si je veux stocker 2 chaînes, et ABContact image (ou une variable pour appeler l'image) qui persistent même après le redémarrage de l'application, quelle méthode dois-je utiliser? NsMutableArray, plist ou SQLite?Devrais-je utiliser plist, SQLite ou NsMutableArray?

+0

Pour ceux qui sont intéressés, je l'ai effectivement utilisé NSMutableArray pour stocker un tableau de NSMutableDictionary qui est ensuite écrit dans plist et enregistré dans le dossier Documents. Quand j'en ai besoin, j'utilise NSMutableArray initWithContentsFromPath: et répète le processus .. – zerlphr

Répondre

4

Pour de très petites quantités de données, comme quelques chaînes, mais pas d'image, vous pouvez également utiliser les NSUserDefaults beaucoup plus simples. C'est généralement pour sauvegarder les préférences ou certaines données persistantes.

Pour enregistrer:

[[NSUserDefaults standardUserDefaults] aString forKey:@"aStringKey]; 
if (![[NSUserDefaults standardUserDefaults] synchronize]) 
    NSLog(@"not successful in writing the default prefs"); 

Pour le lire:

aString = [[NSUserDefaults standardUserDefaults] stringForKey:@"aStringKey]; 

Encore une fois, je ne serais pas aller de l'avant et l'utiliser si ce que vous avez vraiment besoin est une base de données ou un système de fichiers.

Si vous mettez plus de données, et pas assez pour justifier une base de données SQL ou des données de base, alors j'écrirais les données dans un fichier plist. Si toutes vos données sont des objets, alors je le fais:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:kSavedDocFileName]; 
    NSMutableArray *myArrayToSave = [[NSMutableArray alloc] arrayWithCapacity: 48]; 
// 48 since you said in the comments that you have 48 of these 
    for (int i = 0; i < 48; i++) { 
     NSDictionary *myDict = [[NSDictionary alloc] initWithObjectsAndKeys: 
          sting1[i], @"firstStr", //I'm assuming your strings are in a C array. 
          string2[i], @"secondStr",// up to you to replace these with the right 
          url[i], @"myURL",  //way to access your 48 pieces of data 
          nil]; 
     [myArrayToSave addObject:myDict]; 
     [myDict release]; 
    } 
    if (![myArrayToSave writeToFile:path atomically:YES]) 
     NSLog(@"not successful in saving the unfinished game"); 

Et vous pouvez lire les données:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:kMySavedDocName]; 
    NSArray *myLoadedData = [[NSArray alloc] initWithContentsOfFile:path]; 

    for (int i = 0; i < 48; i++) { 
     NSDictionary *myDict = [myLoadedData objectAtIndex:i]; 
     string1[i] = [myDict objectForKey:@"firstStr"]; 
     string2[i] = [myDict objectForKey:@"secondStr"]; 
     url[i] = [myDict objectForKey:@"url"]; 

    } 
    [myLoadedData release]; 

Assurez-vous de ne pas simplement copier et coller ce code puisque je viens dactylographié dans le haut de ma tête. Maintenant, si vous ne voulez pas jouer avec un dictionnaire, vous pouvez le faire aussi. Il est un peu moins élégant:

Economie:

NSMutableArray *myArrayToSave = [[NSMutableArray alloc] arrayWithCapacity: 48 * 3]; 
// 48 since you said in the comments that you have 48 of these three objects 
    for (int i = 0; i < 48; i++) { 
     [myArrayToSave addObject:string1[i]]; 
     [myArrayToSave addObject:string2[i]]; 
     [myArrayToSave addObject:url[i]]; 
    } 
    if (![myArrayToSave writeToFile:path atomically:YES]) 
     NSLog(@"not successful in saving the unfinished game"); 

Charge:

NSArray * myLoadedData = [[NSArray alloc] initWithContentsOfFile: chemin];

for (int i = 0; i < 48; i++) { 
    string1[i] = [myLoadedData objectAtIndex:i * 3]; 
    string2[i] = [myLoadedData objectAtIndex:i * 3 + 1]; 
    url[i] = [myLoadedData objectAtIndex:i * 3 + 2]; 

} 
[myLoadedData release]; 

Une autre remarque importante est que dans tous ces exemples, je suppose que vous faites affaire avec objets (48 fois 3 d'entre eux). C'est pourquoi vous pouvez simplement les ajouter aux dictionnaires et aux tableaux et les sauvegarder et les recharger facilement. Si vous avez affaire à des non-objets, comme des ints, ou des chaînes c ou des BOOL, alors vous devrez utiliser [NSNumber ...] pour les transformer en objets puis [object ...] pour les transformer en non-objets ojects pour commencer. Essayez quelques-unes d'entre elles, puis allez dans le dossier ~/Bibliothèque/Application Support/iPhone Simulator/Applications et regardez dans le dossier Documents, ouvrez le fichier que vous avez enregistré et vérifiez son contenu. C'est toujours rassurant de pouvoir vérifier les données que vous écrivez - et de voir comment les différentes méthodes changent le contenu.

Bonne chance!

+0

Merci beaucoup! En fait, ce dont j'ai besoin est de 2 chaînes et 1 URL d'image à attacher à 48 articles, et entre les redémarrages, je n'ai pas à le récupérer immédiatement mais probablement la phase de jeu commence, je pourrais avoir une phase de chargement et charger tous les attributs ? S'il vous plaît aviser s'il y a une meilleure méthode. Et j'apprécie vraiment votre réponse rapide! – zerlphr

+0

Bien que je n'ai vu aucun nombre officiel indiquant les limites de NSUserDefaults, 48x3 chaînes (comptons l'URL comme une chaîne) est probablement plus que raisonnable. J'ai modifié ma réponse pour inclure un autre moyen. – mahboudz

+0

Merci beaucoup mahboudz! c'est vraiment très apprécié. Merci une fois de plus! va l'essayer et poster n'importe quel problème le cas échéant. – zerlphr

4

Un NSMutableArray ne persistera pas après le redémarrage de l'application. Vous voudrez peut-être regarder un plist qui stocke les deux chaînes et une URL de fichier pointant vers l'image du carnet d'adresses qui est mise en cache dans le sandbox Documents de l'application.

Si vous en avez beaucoup à stocker et à récupérer entre les redémarrages d'applications, consultez les données principales.

+0

Merci beaucoup! En fait, ce dont j'ai besoin est de 2 chaînes et 1 URL d'image à attacher à 48 articles, et entre les redémarrages, je n'ai pas à le récupérer immédiatement mais probablement la phase de jeu commence, je pourrais avoir une phase de chargement et charger tous les attributs ? S'il vous plaît aviser s'il y a une meilleure méthode. Et j'apprécie vraiment votre réponse rapide! – zerlphr

+0

Wow, maintenant que je regarde en arrière, j'ai réalisé comment noobish ma question était ... Merci à tous ici! – zerlphr

1

Ne pas créer de base de données. C'est beaucoup trop pour ces petites données. Un plist serait bien. Vous ne devriez probablement pas utiliser NSUserDefaults, je pense que c'est juste à la limite de trop de données pour cela. Il suffit d'écrire un plist dans le répertoire de documents de votre application et de le charger lorsque votre application redémarre. Vous pouvez stocker un NSMutableArray dans une plist, mais il vous revient sous la forme d'un NSArray. Il suffit de le recréer en tant que tableau mutable avec [NSMutableArray arrayWithArray:] et de le conserver.

0
  • (void) doneAceSpadeSetupClick: (id) sender {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *string1; 
    NSString *string2; 
    NSString *string3; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"card1.plist"]; 
    NSMutableArray *myArrayToSave = [[NSMutableArray alloc] initWithCapacity: 1]; 
    //48 since you said in the comments that you have 48 of these 
    
         NSDictionary *myDict = [[NSDictionary alloc] initWithObjectsAndKeys: 
         string1, characterText.text, //I'm assuming your strings are in a C array. 
         string2, actionText.text,// up to you to replace these with the right 
            string3, objectText.text, 
            nil]; //iPhone simulator crashed at this line 
        [myArrayToSave addObject:myDict]; 
    
    if (![myDict writeToFile:path atomically:YES]) 
        NSLog(@"not successful in saving the unfinished game"); 
    
    
    
    [self dismissModalViewControllerAnimated: YES]; 
    

    }