我使用核心数据来保存一些整数(速率),然后在上下文中调用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];
(我只复制了一些重要的代码,只是为了展示我的所作所为。)
我立即执行一个获取请求,在每个心跳插入和管理对象上下文保存后(我立即保存),并且请求显示心跳似乎存储在Core Data内部(心脏节拍数量不断增加),但是,如果我重新启动我的应用程序(我使用模拟器BTW),我知道事情实际上并没有保存到磁盘,因为它重新启动。使用SQLite3命令行检查显示空表。我在这里缺少什么?
答案 0 :(得分: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];
答案 1 :(得分: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!");
}
请注意,这是BAD CODE。在其他问题中,它不是线程安全的,并且需要太长时间。但是,请尝试使用此功能并删除部分内容以使您满意:)