获取请求导致父管理对象的外键为空

Posted

技术标签:

【中文标题】获取请求导致父管理对象的外键为空【英文标题】:Fecth request causes the foreign key of parent manage object to be null 【发布时间】:2013-11-06 23:53:48 【问题描述】:

我有两个有关系的实体。一个父母和一个孩子(对许多人)。我第一次取它是好的。第二次调用获取请求时,父级的引用键被删除/为空,从而使子记录成为孤儿。

- (void)prepareGallery

    self.events = [[NSMutableArray alloc] init];
    self.photos = [[NSMutableArray alloc] init];

    NSArray *tempArr = [self fetchEntity:@"PEvent" predicate:nil];

    for (Event *pEvent in tempArr) 
        NSSet *photoSet = [pEvent photos];

        NSArray *photosArray = [photoSet allObjects];


        if ([photosArray count] > 0) 
            //only add events with photos
           [self.events addObject:pEvent];
           [self.photos addObject:photosArray];
        

    

    if ([self.events count] > 0) 
        [collectionView reloadData];
    else
        NSLog(@"Events empty");
    


-(NSArray*)fetchEntity:(NSString*) entityName predicate:(NSPredicate*) predicate

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName];

request.resultType = NSManagedObjectResultType;

if (predicate != nil) 
    request.predicate = predicate;


NSError *error;
NSArray *result = [_managedObjectContext executeFetchRequest:request error:&error];

return result;

模型关系

实体:照片 目的地:PEvent 逆:照片 删除规则:无操作 类型:一个

实体:PEvent 目的地:照片 逆:pEvent 删除规则:级联 类型:对许多

【问题讨论】:

【参考方案1】:

几个问题。您的阵列设置不是最佳的。通过创建两个包含事件和照片的单独数组正在破坏这种关系。

这里的关键是完全消除这些人工制品。如果需要,您可以获取所有事件并将它们保存在一个数组中,但当然使用NSFetchedResultsController 为您提供对象会更加健壮。

如果你使用数组,你所需要的只是事件数组。如果对于您的收藏视图数据源,您需要事件的照片数量,那么就像event.photos.count 一样简单。

您在设置例程中执行了一系列完全不必要的操作:

例如您获取所有事件,然后在循环中将它们过滤到一个新数组中。您可以在获取请求中使用谓词。

此外,您将照片NSSet 转换为一个数组(具有随机顺序),这也是不必要的。如果您需要按顺序排列照片,时间戳之类的东西似乎最合适。

【讨论】:

以上是关于获取请求导致父管理对象的外键为空的主要内容,如果未能解决你的问题,请参考以下文章

由于外键为空值,无法从表中获取数据

使用不匹配的外键连接两个表时的空结果集

sql 关联查询外键为空的情况

Php - 无法创建新的数据库记录,因为主键为空(自动增量)

mysql表中,表的外键关联自身主键,为啥插入不了数据?

mybatis 先插入主表数据,获得自增主键。然后作为从表的外键插入从表数据怎么做