我正在非法尝试在不同上下文中的对象之间建立关系'userInfo',同时创建两个对象之间的关系。但是他们有共同的持久协调者和相同的上下文。请帮我找到问题。
....
<script>
function validate(){
var first = document.getElementById('first').innerHTML;
var second = document.getElementById('second').value;
if (second == first){
alert('Ok!');
}
else {
alert('No!');
}
}
</script>
·H
- (void)parser:(NSDictionary *)attributeDict
{
NSEntityDescription *ent = [NSEntityDescription entityForName:@"ThreadInfo" inManagedObjectContext:self.managedObjectContext];
// create an ThreadInfo managed object, but don't insert it in our moc yet
ThreadInfo *info = [[ThreadInfo alloc] initWithEntity:ent insertIntoManagedObjectContext:nil];
self.threadinfo = info;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"UserInfo" inManagedObjectContext:self.managedObjectContext];
fetchRequest.entity = entity;
// narrow the fetch to these two properties
NSPredicate *threadPredicate = [NSPredicate predicateWithFormat:@"userEmail == %@",[attributeDict valueForKey:@"userEmail"]];
[fetchRequest setPredicate:threadPredicate];
NSError *error = nil;
NSArray *fetchedItems = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
for (UserInfo *info in fetchedItems)
{
if([[attributeDict allKeys] containsObject:@"userEmail"])
{
if([attributeDict valueForKey:@"userEmail"]!=[NSNull null])
{
self.threadinfo.userEmail=[attributeDict valueForKey:@"userEmail"];
}
}
if([[attributeDict allKeys] containsObject:@"thread"])
{
if([attributeDict valueForKey:@"thread"]!=[NSNull null])
{
self.threadinfo.threadID=[attributeDict valueForKey:@"thread"];
}
}
if(info!=nil)
{
self.threadinfo.userInfo=info;// **CRASH HAPPENED AT THIS LINE**
[info addThreadDetailsObject:self.threadinfo];
}
ThreadInfo *tInfo = nil;
[self.managedObjectContext insertObject:tInfo];
if ([self.managedObjectContext hasChanges]) {
if (![self.managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@", error);
abort();
}
}
CRASH
@interface batchSave : NSOperation
@property (nonatomic, strong) ThreadInfo *threadinfo;
@property (nonatomic, strong) UserInfo *userInfos;
答案 0 :(得分:0)
ThreadInfo基于您对nil
的使用而拥有-initWithEntity: insertIntoManagedObjectContext:
上下文。您应该在此处传递上下文。
此外,您不应该使用-initWithEntity: insertIntoManagedObjectContext:
。建议您使用类方法+[NSEntityDescription insertNewObjectForEntityForName: inManagedObjectContext:]
,不应将nil
传递给上下文。
你的代码仍然没有意义。
您-init...
带有nil
上下文的ThreadInfo无理由,然后针对名为-insertObject:
的{{1}}引用调用nil
。
如果这是您的实际代码,则会出现大量错误,我甚至无法跟踪您要执行的操作。
就目前而言,您创建的ThreadInfo实体没有上下文。那是造成错误的原因。
tInfo
并使用我推荐的方法。不要使用-initWithEntity: insertNewObjectForEntityForName:
,如果您立即传递上下文,这是多余的。
-insertObject:
假设你有一个正确的双向关系,这些线条做的完全相同,你不需要两者。
为什么要将self.threadinfo.userInfo=info;// **CRASH HAPPENED AT THIS LINE**
[info addThreadDetailsObject:self.threadinfo];
存储为实例属性?看起来它应该只是一个局部变量。
更改您的threadinfo
,即可解决崩溃问题。但是您在此代码中还有其他问题。