【问题标题】: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
删除规则:级联
类型:对许多

【问题讨论】:

    标签: ios core-data relationship nsfetchrequest


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-18
      • 2015-02-01
      • 2014-07-22
      • 2010-10-03
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      相关资源
      最近更新 更多