2011-03-06 10 views
0

J'écris une application pour iPhone; J'ai besoin de sauvegarder les données dans un stockage persistant, mais j'ai des problèmes ... J'ai créé une entité dans xcdatamodel et je n'ai aucun problème pour obtenir la valeur par défaut de mon attribut. Dans mes tests, je passe par le code plusieurs fois ci-dessous et je peux changer cet attribut (c'est un entier) pendant que l'application est active. Toutefois, lorsque je ferme et rouvre l'application, mon entier (myInt) revient à la valeur par défaut lorsque je m'attendais à ce que ce soit la dernière valeur à laquelle je l'ai mise à jour. Voici ce que je fais:Problèmes d'enregistrement dans un stockage persistant iphone

NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext; 
NSEntityDescription *myTestEntity = [NSEntityDescription 
             entityForName:@"TestEntity" 
             inManagedObjectContext:managedObjectContext]; 

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 

[fetchRequest setEntity:timeStampEntity]; 

NSError *error = nil; 
NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
if (fetchedObjects == nil) { 
    // TODO: Handle the error 
} 
for (id oneObject in fetchedObjects) 
{ 
    NSInteger myInt = [[oneObject valueForKey:@"myStoredInt"]intValue]; 
    myInt++; 
    [oneObject setValue:[NSNumber numberWithInt: myInt] forKey:@"myStoredInt"]; 
    NSError *error = nil; 
    if (![managedObjectContext save:&error]) {//TODO: Handle error  
    } 
} 

[fetchRequest release]; 

J'espérais cette ligne:

if (![managedObjectContext save:&error]) 

ferait le travail et enregistrer les modifications apportées au stockage persistant, mais il ne fait pas! (Avoir cette ligne à l'intérieur ou à l'extérieur de la boucle for ne change pas le résultat) Qu'est-ce que je fais de mal?

Merci beaucoup pour votre aide!

Répondre

3

Il vous sera utile si vous pouvez montrer votre code de délégué d'application. Je suppose que quelque part vous êtes en train de réinitialiser les données vous-même. peut-être dans la méthode que vous chargez les données de départ.

3 notes pour le moment:

  1. vous n'avez pas besoin de placer la méthode save dans la boucle. vous devriez placer après tous les changements sont fait et juste une fois.
  2. vérifier si vous avez une méthode de sauvegarde appelée dans le (sinon ajoutez-les):

    - (void)applicationWillTerminate:(UIApplication*)application { 
         [self saveContext]; 
        } 
    
        - (void)applicationDidEnterBackground:(UIApplication*)application { 
        [self saveContext]; 
        } 
    
  3. si la dose n'aider à essayer de voir si vous chargez les valeurs par défaut sur tous les midis de l'application .

BONNE CHANCE

et bienvenue

EDIT

Hey, vous pouvez le faire -

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 

    if (persistentStoreCoordinator_ != nil) { 
     return persistentStoreCoordinator_; 
    } 

    NSURL *storeURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]            stringByAppendingPathComponent: @"anyname.sqlite"]]; 

    //check if the store already exist? 
    BOOL firstRun = NO; 
    if (![[NSFileManager defaultManager] fileExistsAtPath:[storeURL path] isDirectory:NULL]) { 
     firstRun = YES;  
    } 

    NSError *error = nil; 
    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { 

     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    }  

    if(firstRun){ 
     //add your default data here 
    } 
} 
+0

Shani, je vous remercie beaucoup! Vous aviez raison - dans mon délégué d'application, j'initiais l'objet à chaque fois: [NSEntityDescription insertNewObjectForEntityForName: @ "TestEntity" inManagedObjectContext: managedObjectContext]; Vous pouvez dire que je suis novice, je parie. Je veux le faire une seule fois - Comment savoir si je l'ai déjà fait? Merci beaucoup! – san

+0

Salut. j'ai édité ma réponse. – shannoga

+0

C'est Shani! Cela fonctionne comme je le voulais. Merci beaucoup – san

Questions connexes