核心数据不会在应用程序启动之间保持数据

时间:2014-01-30 01:55:32

标签: ios objective-c core-data

我有一个使用核心数据的应用。正在创建Core Data堆栈(上下文,对象图,持久性存储协调器和持久性存储),并且我能够毫无问题地使用它。问题是保存的数据不是持久的,有人可以帮我解决我做错的事吗?这是我创建核心数据堆栈的地方。

- (void)initializeCoreDataStack
{
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Favorites"
                                              withExtension:@"momd"];
    if (!modelURL)
        NSLog(@"MODEL URL NOT INITIALIZED");

    NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    if (!mom)
        NSLog(@"OBJECT MODEL NOT CREATED");

    NSPersistentStoreCoordinator * psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
    if (!psc)
        NSLog(@"PERSISTENT STORE COORDINATOR NOT CREATED");

    NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    [moc setPersistentStoreCoordinator:psc];
    self.managedObjectContext = moc;

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
       NSArray *directory = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory
                                                               inDomains:NSUserDomainMask];
        NSURL *storeUrl = [directory lastObject];
        storeUrl = [storeUrl URLByAppendingPathComponent:@"Favorites.sqlite"];

        NSError *error = nil;
        NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType
                                                     configuration:nil
                                                               URL:storeUrl
                                                           options:nil
                                                             error:&error];
        if (!store)
        {
            NSLog(@"ERROR CREATING STORE: %@ %@", error.localizedDescription, error.domain);
            // present error to user
        }
        else
        {
            dispatch_sync(dispatch_get_main_queue(), ^{
                // do something once the stack is finished being created
                NSLog(@"persistent store created");
            });
        }
    });
}

4 个答案:

答案 0 :(得分:3)

您必须明确保存核心数据,否则它将不会持久存在。但不难解决。

在您的控制器实现文件(例如coreDataViewController.m)中,如果要保存对核心数据的更改,请调用此函数

// add this call, whenever you want to save data
// e.g. responding to a UIButton event
[self saveCoreDataContext];

- (void)saveCoreDataContext
{
    NSError *error = nil;
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if (managedObjectContext != nil) {
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
    }
}

答案 1 :(得分:1)

我个人的经验是,即使您拨打[moc save:error],您也可能无法找到从Xcode运行应用程序时保存的内容 - >在设备上构建和运行。但是,如果您停止运行应用程序的Xcode,并通过单击应用程序图标从设备启动应用程序,则内容实际上是持久的。

我通过反复试验找到的个人经历,希望你看到同样的事情。

答案 2 :(得分:0)

您必须保存MOC [妈妈保存:零];

答案 3 :(得分:-1)

这里有一些东西对我来说很奇怪。首先,为什么要线程创建NSPersistentStore?通常,我创建NSPersistentStoreCoordinator,添加NSPersistentStore,然后创建上下文。我建议按顺序这样做,除非你有充分的理由不这样做。虽然没有明确禁止,但在NSPersistentStore创建后添加NSManagedObjectContext时可能会遇到问题。

我不确定是否需要,但我总是明确强烈提及NSPersistentStoreCoordinator。创建多个上下文也很有用。我建议你在代码中这样做。

正如其他人所说,你还需要明确保存。