【发布时间】:2015-10-19 21:52:40
【问题描述】:
我正在尝试将某个 JSON 创建的对象保存在核心数据中,但它没有保存。我怀疑问题是我创建托管对象上下文太多次或试图保存到错误的托管对象上下文。当我收到 managedobjectcontext = nil 错误时,我必须继续声明它。想知道是否有人可以帮助我发现我一直没有发现的错误。
-(void) importItems:(NSArray *)ItemsToImport
{
int i;
int max = [itemsToImport count];
IDItemServer *importItem;//this is import object
Items *Item; //this is core data entity
NSManagedObjectContext *context = self.managedObjectContext;
for (i=0;i<max;i++)
{
NSLog(@"value of i is%d:",i);
importItem = ItemsToImport[i];
NSString *name = importItem.name;
NSString *sub = importItem.sub;
//save our new and updated changes to the Core Data store
NSManagedObjectContext *context = [IDModel sharedInstance].managedObjectContext;
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:context];
//was self.managedObjectContext
// Initialize Record
NSManagedObject *record = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:context];
// Populate Record
[record setValue:name forKey:@“name”];
[record setValue:sub forKey:@“s”ub];
}
// Save Record
NSError *error = nil;
NSLog(@"BEFORE SAVE”);//Logs to console
if ([context save:&error]) {
NSLog(@"AFTER SAVE”);//does not log to console
} else {
if (error) {
NSLog(@"%@, %@", error, error.localizedDescription);//does not log to console
}
// Show Alert View
[[[UIAlertView alloc] initWithTitle:@"Warning" message:@"Your Item could not be saved." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
//THIS ALERT FIRES
}
}
【问题讨论】:
-
你们为什么有这么多不同的 MOC?他们真的不一样吗?它们是如何创建的?除非它们都是 NSMainQueueConcurrencyType,否则你就违反了各种核心数据规则。另外,请解释您期望此代码做什么,以及它在做什么是不正确的。仅仅说它不储蓄是不够的。如果您没有收到日志消息,那么当您单步执行调试器时会发生什么?此外,您的代码示例有问题。我试图重新格式化它以使其更易于阅读,并且您的大括号不平衡,表明存在其他问题。
-
这个方法实际上是从viewdidload中另一个方法调用的另一个方法调用的。由于 VC 中已经有一个延迟加载的 MOC,最初我认为这就足够了。但我得到 MOC 是零错误。为了摆脱这些,在回答 SO 之后,我不断添加 MOC,但可能太多了。我会试着把它们剪掉。 (多余的大括号是删掉很多无关的注释代码和注释的结果。)
-
我怀疑在你编辑你的问题之前你会得到很多帮助。我知道我什至不会尝试再次阅读它,直到我看到它已经显着更新。
-
代码已尽可能简化以仍然显示问题。如果您觉得它很费力,您无需再阅读它。
标签: ios objective-c core-data