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一对多记录插入错误的主要内容,如果未能解决你的问题,请参考以下文章

Restkit, Swift, Core data 一对多

如何为一对多关系正确配置 Core Data 数据模型和 NSManagedObject?

将 Core Data 中的一对多显示为一对一

RestKit Core Data 一对多映射

Core Data 上的一对多关系

Core Data addObject 一对多关系