获取请求导致父管理对象的外键为空
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
转换为一个数组(具有随机顺序),这也是不必要的。如果您需要按顺序排列照片,时间戳之类的东西似乎最合适。
【讨论】:
以上是关于获取请求导致父管理对象的外键为空的主要内容,如果未能解决你的问题,请参考以下文章