Core Data一对多记录插入错误
Posted
技术标签:
【中文标题】Core Data一对多记录插入错误【英文标题】:Core Data one to many record insert error 【发布时间】:2013-08-21 21:29:27 【问题描述】:我有三个实体
Forms
name:string
jobs<-->>JSAjobs.form
JSAjobs
name:string
form<<-->Forms.jobs
Jobs
step:string
jobs<<-->Forms.jobs
我收到此错误:
objectID 0x95afe60 的对多关系错误“作业”。 . .从数据库实现。有 0 行
现在我先保存 Forms 实体的行,稍后我需要获取 Form 实体上的最后一条记录在 JSAjobs
上创建一个新行,并在 JSAjop
上创建一个新行,如下所示
谢谢
NSMutableArray *jobData = [[NSMutableArray alloc]initWithArray:controller.jobData];
NSManagedObjectContext *context = [self managedObjectContext];
NSError *error;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"JSAform" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSPredicate *testForFalse = [NSPredicate predicateWithFormat:@"emailed == NO"];
[fetchRequest setPredicate:testForFalse];
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
NSLog(@"Fetched Rows: %i", [fetchedObjects count]);
//NSManagedObject *existingParent= //... results of a fetch
JSAform *lastForm = [fetchedObjects objectAtIndex:0];
JSAjobs *newJobs = [NSEntityDescription insertNewObjectForEntityForName:@"JSAjobs" inManagedObjectContext:context];
// Setting new values
newJobs.jobType = [NSString stringWithFormat:@"%@", [jobData objectAtIndex:0]];
newJobs.jobName = [NSString stringWithFormat:@"%@", [[[jobData objectAtIndex:1]objectAtIndex:0] objectAtIndex:0]];
newJobs.comments = [NSString stringWithFormat:@"%@", [[[jobData objectAtIndex:1]objectAtIndex:0] objectAtIndex:1]];
newJobs.date = [NSDate date];
[newJobs setValue:lastForm forKey:@"form"];
if (![context save:&error])
NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
//New SOP Value
JOBsop *jobSOP = [NSEntityDescription insertNewObjectForEntityForName:@"JOBsop" inManagedObjectContext:context];
for (int i = 0; i< [[jobData objectAtIndex:1]count]; i++)
NSLog(@"Value for key: %i", i);
if (i > 0)
for (int k = 0; k< [[[jobData objectAtIndex:1]objectAtIndex:i] count]; k++)
jobSOP.step = [[[jobData objectAtIndex:1]objectAtIndex:i] objectAtIndex:k];
[jobSOP setValue:newJobs forKey:@"jobs"];
// [NSNumber numberWithInt:[txtBoots.text integerValue]];
NSLog(@"Simple key: %@", [[[jobData objectAtIndex:1]objectAtIndex:i] objectAtIndex:k]);
if (![context save:&error])
NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
enter code here
【问题讨论】:
对不起,我的关系伪代码有错误 对不起,我的关系伪代码是这样的形式有一个错误 Forms name:string jobs>JSAjobs.form JSAjobs name:string steps>jobsDetail.jobs 谢谢 【参考方案1】:您的实体非常混乱,因为您没有选择可用的实体名称。你太困惑了,无法自己布置这些简单的关系。这会导致代码混乱,并且不允许您以结构化的方式思考问题。
您的代码完全无法理解。尽管有一个获取的结果控制器(大概),但您有一个数据数组。您的代码的第二部分显示了一个神秘而神秘的新实体 JOBsob
。你不可能问这样一个有意义的问题,更不用说得到答案了。
你有嵌套数组,没有任何类型检查,这必然会破坏并且以任何方式完全不可能调试。摆脱所有这些。
尽管如此,让我们尝试五次让您入门:
首先,对实体名称使用复数是没有意义的。如果实体表示“表单”,则应为Form
而不是Forms
。
也许你想要这个设置:
Form <<----> Job <----->> JobDetail
一份工作有许多表格和许多工作细节。因此,Form 具有job
的关系,而 Job 具有forms
的关系。类似地,Jobdetail 具有关系 job
,而 Job 具有关系 details
。
当您有一个表单并创建一个新工作时,您只能为其分配一个工作。因此,旧的工作(如果有的话)关系将被打破。
oldForm.job = newJob;
这是一种更安全的关系分配方式。当然,您已经为此目的为这些实体创建了 NSManagedObject 子类。
但是,如果 Job 和 Form 之间的关系在另一个方向上是一对多的,那么您的方案将如下所示。
Form <---->> Job <------>> JobDetail
我现在真的不知道在这种情况下“表单”是什么意思——为了清楚起见,我将把它重命名为 Project
。
Project <---->> Job <------>> JobDetail
现在您可以将新工作分配给项目并链接其他关系,如下所示:
newJob.project = existingProject;
newJobDetail.job = newJob;
【讨论】:
我不得不说非常感谢您的解释,我按照您的建议重新组织了结构,一切都很完美。以上是关于Core Data一对多记录插入错误的主要内容,如果未能解决你的问题,请参考以下文章