2011-03-06 199 views
0

我正在写一个iphone应用程序;我需要将数据保存到持久性存储,但我遇到问题... 我在xcdatamodel中创建了一个实体,并且我没有问题获取为我的属性设置的默认值。在我的测试中,我通过下面的代码几次,并可以在应用程序处于活动状态时更改此属性(它是一个整数)。但是,当我关闭并重新打开应用程序时,我的整数(myInt)返回到默认值,当我预期它是我更新它的最后一个值。 下面是我在做什么:存储问题永久存储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]; 

我希望这条线:

if (![managedObjectContext save:&error]) 

会做的工作,并保存更改到永久存储,但它不会! (在for循环内部或外部有这条线不会改变结果) 我在做什么错了?

非常感谢您的帮助!

回答

3

如果您可以显示您的应用程序委托代码将会很有帮助。我的猜测是,你正在重新设置自己的数据。也许在加载启动数据的方法中。

3笔记现在:

  1. 你不需要放置在循环内保存 方法。你应该在 之后放置它,所有的更改都是 而且只是一次。
  2. 检查,如果你调用的保存方法(如果不添加的话):

    - (void)applicationWillTerminate:(UIApplication*)application { 
         [self saveContext]; 
        } 
    
        - (void)applicationDidEnterBackground:(UIApplication*)application { 
        [self saveContext]; 
        } 
    
  3. 如果剂量忍不住试一试,看是否要加载的应用程序的每一个午餐的默认值。

GOOD LUCK

,并欢迎

编辑

嘿,你能做到这一点 -

- (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

沙尼,太感谢你了!你是对的 - 在我的应用程序委托中,我每次都启动对象:[NSEntityDescription insertNewObjectForEntityForName:@“TestEntity”inManagedObjectContext:managedObjectContext];我敢打赌,你可以告诉我是新手。我只想做一次 - 我怎么知道我是否已经做到了?非常感谢! – san 2011-03-06 08:16:05

+0

嘿。我编辑了我的答案。 – shannoga 2011-03-06 08:54:49

+0

这就是沙尼!它像我想要的那样工作,非常感谢 – san 2011-03-06 19:26:51