保存到持久存储iphone的问题

时间:2011-03-06 05:57:20

标签: iphone core-data persistent-storage xcdatamodel

我正在写一个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循环内部或外部使用此行不会更改结果) 我做错了什么?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:3)

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

现在有3个笔记:

  1. 您无需进行保存     循环内的方法。你应该     在所有变化之后放置它     做了一次。
  2. 检查是否在(如果没有添加)中调用了一个save方法:

        - (void)applicationWillTerminate:(UIApplication*)application {
           [self saveContext];
         } 
    
        - (void)applicationDidEnterBackground:(UIApplication*)application {
         [self saveContext];
        }
    
  3. 如果它无助于尝试查看您是否在该应用的每个午餐上加载默认值。

  4. 好运

    欢迎

    修改

    嘿,你可以这样做 -

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