Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 建立关系的非法企图';检查表';在不同上下文中的对象之间_Ios_Core Data_Nsmanagedobjectcontext - Fatal编程技术网

Ios 建立关系的非法企图';检查表';在不同上下文中的对象之间

Ios 建立关系的非法企图';检查表';在不同上下文中的对象之间,ios,core-data,nsmanagedobjectcontext,Ios,Core Data,Nsmanagedobjectcontext,我正在将核心数据用于iOS应用程序的脱机存储,我不断收到以下错误: 非法尝试在不同上下文中的对象之间建立关系“检查表” 问题是,我肯定是在使用相同的上下文来创建关系。以下是触发问题的代码块: NSMutableSet *checklists = [[NSMutableSet alloc] init]; for (NSDictionary *dict in array){ Checklists *checklist = [self addChecklist:dict withContex

我正在将核心数据用于iOS应用程序的脱机存储,我不断收到以下错误:

非法尝试在不同上下文中的对象之间建立关系“检查表”

问题是,我肯定是在使用相同的上下文来创建关系。以下是触发问题的代码块:

 NSMutableSet *checklists = [[NSMutableSet alloc] init];
for (NSDictionary *dict in array){
    Checklists *checklist = [self addChecklist:dict withContext:context];
    [checklists addObject:checklist];
    DLog(@"context: %@", checklist.managedObjectContext);
}

//Delete any lists that aren't from the server
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
Users *currentUser = (Users *)[self getUserWithId:[defaults objectForKey:@"user_id"] withContext:context];
DLog(@"context: %@", context);
currentUser.checklists = checklists;
异常在最后一行抛出,
currentUser.checklists=checklists
上下文中的日志是相同的,并且对象位于同一线程中。以前有人碰到过这个吗

addChecklist:withContext:的代码:

- (Checklists *) addChecklist:(NSDictionary *) dict withContext:(NSManagedObjectContext *)context{
    //Pull the list from the database and update
    Checklists *checklist = [self getChecklistWithId:dict[@"_id"] withContext:context];

    //If the list doesn't exist, add it to the database
    if(!checklist)
        checklist = (Checklists *)[NSEntityDescription insertNewObjectForEntityForName:@"Checklists" inManagedObjectContext:context];

    //Update or create the list attributes
    checklist.checklist_id = dict[@"_id"] ? dict[@"_id"] : [NSString stringWithFormat:@"%d", (arc4random() % 2000)];
    checklist.desc = dict[@"description"] == [NSNull null] ? nil : dict[@"description"];
    checklist.name = dict[@"name"] == [NSNull null] ? nil : dict[@"name"];
    checklist.published = dict[@"published"] == [NSNull null] ? 0 : dict[@"published"];
    checklist.created_at = dict[@"created_at"] == [NSNull null] ? nil : dict[@"created_at"];
    checklist.updated_at = dict[@"updated_at"] == [NSNull null] ? nil : dict[@"updated_at"];

    [self addChecklistSections:dict[@"checklist_sections"] withChecklist:checklist withContext:context];

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    [self saveMasterContext];

    return checklist;
}
getUserWithId:withContext:

- (Users *) getUserWithId:(NSString *)user_id withContext:(NSManagedObjectContext *) context
{
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Users" inManagedObjectContext:context];
    [request setEntity:entity];
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"(user_id = %@)", user_id];
    [request setPredicate:pred];

    NSError *error = nil;
    NSMutableArray *users = [[context executeFetchRequest:request error:&error] mutableCopy];
    if (users == nil || users.count == 0) {
        return nil;
    }
    return users[0];
}

我看不出为获取的用户制作
mutableCopy
的动机。我认为这可能是你得到上下文错误的原因。理论上,它应该只是复制指向对象的指针,但谁知道幕后发生了什么

相反,请将提取请求的
fetchLimit
设置为
1
,然后检查是否只得到一个结果。直接返回此结果,而不是其副本

还不清楚为什么在传递上下文时调用上下文保存方法(saveMasterContext)。打电话更合乎逻辑

[context save:nil];

此外,根据苹果的大量示例代码,您应该考虑将类的上下文设置为“代码< >属性< /代码>,而不是作为方法参数传递它。

--

顺便说一句,我真的认为你应该放弃用复数命名实体的习惯。清单实际上是一个清单,而不是清单

此外,依赖字符串的id方案也不是很有效。考虑使用一个数值等价物。另外,我发现分配一个随机的清单id相当危险


此外,代码中还有一些零散的行,例如在从
addChecklist
返回之前为用户默认值定义一个未使用的变量。您应该发布
addChecklist
getUserWithId
的内容。使用两个MOC创建两个不同的实体,然后在它们之间创建关系,就会触发错误。因此,请确保对
检查表
用户
实体使用相同的NSManagedObjectContext。@DanyData我刚刚添加了您需要的代码requested@danypata用户肯定不是零-我只是将其打印出来,并考虑同时记录
[checklist managedObjectContext]
[User managedObjectContext]
而不是
上下文
,只是为了排除
上下文
以某种方式被更改的可能性,以使您在登录时看起来好像已将内容放在正确的上下文中。另外,也许可以查看
saveMasterContext
的代码,并验证它没有以某种方式篡改
context
。@Carlvaezey我按照您的建议打印了ManagedObjectContext,验证了它们是相同的上下文。