2010-07-15 5 views
0

J'ai une application iPhone simple qui accède à certaines données à distance au démarrage puis demande à l'utilisateur de sélectionner l'une des options choisies, mais cela arrive à chaque fois l'application démarre, et je veux que l'application se souvienne de ce choix pour la prochaine fois, comment puis-je persister cet objet en utilisant des données de base? Je suis très nouveau à Core Data, et je pense que c'est quelque chose à voir avec l'ajout d'un objet au NSManagedObjectContext mais je ne suis pas sûr s'il y a un moyen de stocker un objet contre une clé ou quelque chose de sorte que je puisse vérifier été choisi avant rapidement pour éviter de faire l'appel à distance ...quelle est la meilleure façon de stocker un seul objet dans les données de base pour un utilisateur

EDIT

Ok, semble comme NSUserDefaults est le chemin à parcourir, mais j'ai un petit problème, ma classe personnalisée est étend NSManagedObject qui J'entends est un peu difficile de stocker une instance de NSUserDefaults, donc j'ai écrit un petit convertisseur qui prend chaque propriété de la cl ass et le place dans NSUserDefaults séparément sous différentes clés.

comme ceci:

-(void)saveDeviceForUser:(Device*) device 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    NSData *encodedActive = [NSKeyedArchiver archivedDataWithRootObject:device.active]; 
    [defaults setObject:encodedActive forKey:@"UsersDevice_Active"]; 

    //and so on for each property of the Device object 
} 

puis-je récupérer mon objet de la même manière:

-(Device*)loadDeviceForUser 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    NSData *encodedActive = [defaults objectForKey: @"UsersDevice_Active"]; 
    NSNumber* unarchivedActive = (NSNumber*)[NSKeyedUnarchiver unarchiveObjectWithData: encodedActive]; 

    Device *d = [[Device alloc] init]; 
    d.active = unarchivedActive; 

    return d; 
} 

Mais, quand je rentre à la ligne ci-dessus d.active = unarchivedActive je reçois une erreur:

Terminaison de l'application en raison d'une exception non interceptée 'NSInvalidArgumentException', raison: '- [Device setActive:]: sélecteur non reconnu envoyé à l'instance 0xac0be1 0 '

Mes propriétés de classe sont configurées en utilisant @dynamic et non @synthesize, alors dois-je implémenter les setters et les getters pour que cela fonctionne? Cela va-t-il perturber les données de base de quelque façon que ce soit?

J'espère que le bon sens

Cheers, Mark

+1

Vous avez NSNumber * unarchivedActive, il peut être nécessaire d'être NSNumber * unarchivedActive – Kurbz

+0

bingo !! il s'est avéré qu'il y avait beaucoup de problèmes ici, et il était tard ... stupide copier et coller des erreurs !! merci pour l'aide tous triés maintenant :) – Mark

Répondre

3

je stocker l'objet en utilisant NSUserDefaults

Lorsque vous enregistrez un objet personnalisé, vous devez archive correctement

+0

Un autre exemple est d'utiliser un [NSMutableDictionary] personnalisé (http://stackoverflow.com/questions/1609305/updating-changing-settings-plist-files-with-new-versions-of -an-app) – tadman

+0

** @ dylan **, merci, je vais essayer et vous dire, mais question rapide, voulez-vous dire que pour stocker un objet dans NSUserDefaults j'ai besoin de définir comment il est sérialisé? ** @ tadman ** J'ai besoin de persister l'objet sur les exécutions de l'application – Mark

+0

Pour stocker des choses dans 'NSUserDefaults', elles doivent être décomposées en objets, chaînes, nombres, dates, dictionnaires, tableaux, etc. Transformez-le en données binaires. Le stocker en tant qu'objets standard est plus facile. –

Questions connexes