我的核心数据定义如下: 用户有很多事件; event只有一个用户关系;
用户和事件都是核心数据实体。用户实体通过故事板segue传入。
我正在尝试配置NSPredicate以仅为该特定用户的事件填充该用户的详细信息UITableView。
到目前为止,我已经尝试了
//does not work
NSPredicate* onlyThisUserPredicate = [NSPredicate predicateWithFormat:@"user == %@",self.appUser];
//does not work
NSPredicate* onlyThisUserPredicate = [NSPredicate predicateWithFormat:@"SELF.user == %@",self.appUser];
比较事件的正确语法是什么,只返回那些用户对象等于指定用户对象的语法?
更新:
我正在尝试使用这种获取的结果控制器向用户添加事件:
-(NSFetchedResultsController*)fetchedResultsController
{
if (__fetchedResultsController != nil) {
return __fetchedResultsController;
}
// Set up the fetched results controller.
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:[Event managedObjectContext]];
[fetchRequest setEntity:entity];
// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];
//I need to configure this user
NSPredicate* onlyThisUserPredicate = [NSPredicate predicateWithFormat:@"user = %@",self.appUser];
// The first sort key must match the section name key path key if present, otherwise the initial dataset would be messed up: rows in incorrect sections
NSString* firstSortKey = @"createDate";
NSSortDescriptor *firstSortDescriptor = [[NSSortDescriptor alloc] initWithKey:firstSortKey ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:firstSortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[fetchRequest setPredicate:onlyThisUserPredicate];
// Edit the section name key path and cache name if appropriate.
// nil for section name key path means "no sections".
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[Event managedObjectContext] sectionNameKeyPath:nil cacheName:@"Events"];
self.fetchedResultsController = aFetchedResultsController;
aFetchedResultsController.delegate = self;
// [aFetchedResultsController release];
[sortDescriptors release];
[fetchRequest release];
NSError *error = nil;
if (![__fetchedResultsController performFetch:&error]) {
/*
Replace this implementation with code to handle the error appropriately.
abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
*/
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
// abort();
}
return __fetchedResultsController;
}
谢谢!
答案 0 :(得分:1)
那么这个谓词对于User实体是否正确?如果是这样,你试试这个:
NSPredicate* onlyThisUserPredicate = [NSPredicate predicateWithFormat:@"SELF == %@",self.appUser];
然后您可以通过以下方式访问您的活动:
[self.appUser events];
答案 1 :(得分:1)
好的,我可以想到的一些事情可能会导致这种行为。
首先,您是否在此函数中验证了self.appUser的值?它是否符合您的期望?
其次,您确定您的标题是最新的并包含在此文件中吗?有时,当我的标题与coredata模型不一致时,我会遇到奇怪的行为。
答案 2 :(得分:0)
如果您已经从Core Data存储中检索到'user',那么您应该只需遵循该关系即可访问其事件 - 无需单独获取提取请求:
NSSet *events = self.appUser.events;
另一方面,如果self.appUser
不是托管对象,那么在谓词中使用==
运算符可能就是问题所在。因此,我假设self.appUser
只是一个包含用户名的字符串,而不是数据存储中的用户对象。然后你在谓词中使用'like'运算符:
NSPredicate* onlyThisUserPredicate = [NSPredicate predicateWithFormat:@"user like %@",self.appUser];
另外,请确保您在获取请求中指定了正确的实体。对于您所描述的内容,您应该使用事件实体的实体描述进行提取。