gpt4 book ai didi

ios - 非法尝试在不同上下文中的对象之间建立关系 'checklists'

转载 作者:行者123 更新时间:2023-11-29 03:42:55 26 4
gpt4 key购买 nike

我正在使用 Core Data 来离线存储我的 iOS 应用程序,但我不断收到以下错误:

Illegal attempt to establish a relationship 'checklists' between objects in different contexts

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

 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。来自context的日志是相同的,并且对象位于同一个线程中。有人遇到过这个吗?

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];

此外,按照 Apple 的大量示例代码,您应该考虑将上下文设置为类的 @property,而不是将其作为方法参数传递。

--

顺便说一句,我真的认为你应该放弃以复数命名实体的习惯。检查表实际上是检查表,而不是检查表。

此外,依赖字符串的 id 方案效率不高。考虑使用等价的数字。另外,我发现分配随机 list ID 相当危险。

此外,代码中还有一些杂散行,例如在从 addChecklist 返回之前为用户默认值定义未使用的变量。

关于ios - 非法尝试在不同上下文中的对象之间建立关系 'checklists',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18148934/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com