3

我正在使用核心数据来保存一些整数(速率),然后在上下文中调用 save :

HeartRateBeat * beat = [HeartRateBeat heartRateWithHeartRate:rate
                            ofRecordTitle:self.recordTitle
                   inManagedObjectContext:document.managedObjectContext];

NSError * error;
[document.managedObjectContext save:&error];

在那个方便的方法中,我使用 NSEntityDescription 创建对象,如下所示:

heartRateBeat = [NSEntityDescription insertNewObjectForEntityForName:@"HeartRateBeat" inManagedObjectContext:context];

(我只复制了一些重要的代码,只是为了展示我所做的。)

在插入每个心跳并保存托管对象上下文(我立即保存)后,我立即执行一个 fetch 请求,并且该请求显示心跳似乎确实存储在 Core Data 中(随着心跳数组的增加),但是如果我重新启动我的应用程序(我正在使用模拟器顺便说一句)我知道事情实际上并没有保存到磁盘,因为它重新开始。使用 SQLite3 命令行检查会显示空表。我在这里想念什么?

4

2 回答 2

4

我遇到了同样的问题,但我认为这只是因为,我假设,像我一样,您只是通过 xcode 停止应用程序,而不是真正关闭它。我使用此代码强制写入。我使用的是通过 appdelegate 共享的 UIManagedDocument,而不是手动设置所有内容。

NSError *error = nil;

if (![self.managedObjectContext save:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

[[AppDelegate sharedAppDelegate].userDatabase saveToURL:[AppDelegate sharedAppDelegate].userDatabase.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:nil];
于 2012-11-12T08:43:02.013 回答
0

我不了解你们,但是当我想要我的核心数据保存时,我的核心数据更好地保存。

这里有一些代码肯定会保存你所有的核心数据。

-(void)forceSave {
        NSManagedObjectContext * context = self.managedObjectContext; //Get your context here. 
    if (!context) {
        NSLog(@"NO CONTEXT!");
        return;
    }

    NSError * error;
    BOOL success = [context save:&error];
    if (error || !success) {
        NSLog(@"success: %@ - error: %@", success ? @"true" : @"false", error);
    }

    [context performSelectorOnMainThread:@selector(save:) withObject:nil waitUntilDone:YES];
    [context performSelector:@selector(save:) withObject:nil afterDelay:1.0];
    [context setStalenessInterval:6.0];
    while (context) {
        [context performBlock:^(){
            NSError * error;
            bool success =  [context save:&error];
            if (error || !success)
                NSLog(@"success: %@ - error: %@", success ? @"true" : @"false", error);

        }];
        context = context.parentContext;
    }

    NSLog(@"successful save!");

}

请注意,这是错误代码。除其他问题外,它不是线程安全的并且需要太长时间。但是,请尝试使用它并删除其中的某些部分以使您满意:)

于 2014-06-21T06:52:05.030 回答