0

我正在编写一个 iphone 应用程序;我需要将数据保存到持久存储中,但我遇到了问题......我在 xcdatamodel 中创建了一个实体,并且我没有问题为我的属性设置默认值。在我的测试中,我多次通过下面的代码,并且可以在应用程序处于活动状态时更改此属性(它是一个整数)。但是,当我关闭并重新打开应用程序时,我的整数 (myInt) 会恢复为默认值,而我预计它是我将其更新为的最后一个值。这是我正在做的事情:

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 循环内部或外部有这条线不会改变结果)我做错了什么?

非常感谢您的帮助!

4

1 回答 1

3

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

目前有3个注意事项:

  1. 您不需要将 save 方法放在循环内。您应该在进行所有更改后放置它,并且只放置一次。
  2. 检查您是否在(如果没有添加它们)中调用了保存方法:

        - (void)applicationWillTerminate:(UIApplication*)application {
           [self saveContext];
         } 
    
        - (void)applicationDidEnterBackground:(UIApplication*)application {
         [self saveContext];
        }
    
  3. 如果没有帮助,请尝试查看您是否在应用程序的每次午餐时加载默认值。

祝你好运

并欢迎

编辑

嘿,你可以这样做——

- (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
    }
}
于 2011-03-06T06:28:41.630 回答