ios - 核心数据不是在应用程序启动之间保留数据

标签 ios objective-c 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");
            });
        }
    });
}

最佳答案

您必须显式保存核心数据,否则它不会持久。不过解决起来并不难。

在 Controller 实现文件(例如 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();
        }
    }
}

关于ios - 核心数据不是在应用程序启动之间保留数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21446443/

相关文章:

iphone - 核心数据中的 mach_msg_trap

ios - MagicalRecord 中的 MR_saveToPersistentStoreWithCompletion 方法和 MR_saveToPersistentStoreAndWait 方法有什么区别

ios - Xcode 5 iPhone 模拟器没有手机形状

objective-c - 已发布的 UIViewController 已正确销毁,但未调用其 -(void)dealloc 方法

ios - 为 iOS8 和 iOS7 兼容性转换 iOS9 合并触摸绘图代码

objective-c - 是否可以更新 iPhone 中的本地通知

ios - 管理以编程方式实例化的 View Controller 的实例

iPhone 在核心数据中保存多个对象?

ios - stringByReplacingOccurrencesOfString 方法调用不会更改我调用它的字符串

android - apache cordova 应用程序中的通知处理