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?
Répondre
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!
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
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
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
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.
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
Wow, maintenant que je regarde en arrière, j'ai réalisé comment noobish ma question était ... Merci à tous ici! – zerlphr
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.
(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];
}
- 1. plist ou sqlite
- 2. NSMutableArray + tableView + SQLite
- 3. objet SQLite à NSMutableArray
- 4. Comment utiliser containsObject dans NSMutableArray
- 5. iOS: formulaire de migration plist à SQLite magasin de données
- 6. iPhone/Mac - vecteur C++ ou NSMutableArray
- 7. Utiliser SQLite avec Qt
- 8. SQLite, SQL: Utiliser UPDATE ou INSERT en conséquence
- 9. je veux utiliser ireport avec sqlite ou java derby
- 10. Initialiser NSMutableArray: [tableau NSMutableArray];
- 11. RSS Reader - données plist ou noyau
- 12. Utiliser un NSMutableArray au lieu d'un NSFetchedResultsController
- 13. accéder aux données plist
- 14. Quand utiliser pragmas sur sqlite?
- 15. Tableau de iPhone plist
- 16. Comment convertir NSString en NSMutableArray?
- 17. Plist binaire Vs normal plist
- 18. NSMutableArray Problème - iPhone
- 19. UITableView + NSMutableArray comportement étrange
- 20. iPhone plist et NSDate émet
- 21. NSArray à plist sur mac
- 22. App se bloque lorsque NSMutableArray à plister
- 23. images de chargement de plist
- 24. Récupérer le fichier plist distant, utiliser dans UITableView
- 25. randomiser la chaîne tirée d'un fichier plist
- 26. extraction de données à partir d'un plist
- 27. où utiliser SQLITE dans les applications iPhone?
- 28. SQLite ou fichier texte à plat?
- 29. UITableView Plist Not Returning valueForKey
- 30. Lire/écrire sur un fichier Plist sans utiliser l'iPhone SImulator?
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