【问题标题】:problems saving to persistent storage iphone保存到持久存储 iphone 的问题
【发布时间】:2011-07-09 16:51:17
【问题描述】:

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

非常感谢您的帮助!

【问题讨论】:

    标签: iphone core-data persistent-storage xcdatamodel


    【解决方案1】:

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

    目前有 3 个注意事项:

    1. 你不需要放置存档 循环内的方法。你应该 在所有更改完成后放置它 只制作一次。
    2. 检查你是否有一个 save 方法被调用(如果没有添加它们):

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

    【讨论】:

    • Shani,非常感谢!您在我的应用程序委托中是对的,我每次都在启动对象:[NSEntityDescription insertNewObjectForEntityForName:@"TestEntity" inManagedObjectContext:managedObjectContext];你可以说我是新手,我敢打赌。我只想这样做一次 - 我怎么知道我是否已经这样做了?非常感谢!
    • 这就是Shani!它就像我想要的那样工作。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多