我在网上搜索了很多,但找不到我要找的东西。
我有一个模型,它可能是很多用户。所以我有一个叫做User的实体。用户拥有记录的NSSet。我想从给定的用户那里获取记录。我试图这样做,但它仍然返回所有用户的记录。
NSManagedObjectContext *context = _backgroundContext;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Record"
inManagedObjectContext:context];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(date >= %@)",date];
NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"User = %@",currentUser];
NSPredicate *predicates = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:predicate,predicate1, nil]];
[fetchRequest setPredicate:predicates];
[fetchRequest setPredicate:predicate];
[fetchRequest setEntity:entity];
NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];我知道这并不难,但我找不到它是什么,我希望你们中的一些人能帮上忙。提前感谢!
编辑:
正如我所说的,我有一个实体User,它包含:
NSString name,
int age,
NSSet records, ...Record有自己的属性,如:
NSDate date,
NSString name,
NSString event,
...我想要形成一个获取请求,只从特定用户获取记录。我不知道怎么做,因为我从每个用户那里得到了所有的记录。
唱片有很多种关系。我可以获得像currentUser.records这样的记录,但是我不能让用户使用record.User。
发布于 2012-12-29 07:09:59
错误在这里:
[fetchRequest setPredicate:predicates];
[fetchRequest setPredicate:predicate];在设置复合谓词之后,只为date覆盖它。您可能要删除第二行。
编辑:获取请求要求您已经定义了一个从Record到User的反向关系User,并在谓词中使用了这个关系的确切名称。
另一种解决方案是使用从User到Record的“前向”关系,并过滤结果:
NSSet *records = [currentUser.records filteredSetUsingPredicate:predicates];或者,如果你喜欢数组
NSArray *records = [[currentUser.records allObjects] filteredArrayUsingPredicate:predicates];发布于 2014-02-21 14:35:26
我假设您的模型大致如下所示,即记录关系有一个名为user的逆关系:

重要的是,这种关系是相反的关系,因为否则核心数据将不会自动维护它。然后,您可以在给定日期/之后查询给定用户的所有记录,如下所示:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Record"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"user = %@ AND (date >= %@)", currentUser, date];
NSError *error = nil;
NSArray *records = [_backgroundContext executeFetchRequest:fetchRequest error:&error];
NSLog(@"records: %@", records);我已经重写了您的代码,使其更加紧凑,但重要的更改是,这将在一次操作中创建查询。
发布于 2012-12-29 07:32:27
正如Martin R所说,您正在替换您的谓词。正如他还提到的,用户属性应该是小写的,因为我非常肯定核心数据会强制这样做。如果您尝试用大写字母创建关系,它会给您一个错误,所以请尝试
NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"user = %@",currentUser];而不是。显然,如果您的模型没有为用户定义一个属性,那么它也不会工作,您需要将其更改为您的模型实际拥有的任何属性,但这应该有效。
编辑:
尝试在模型中添加一个逆关系。所以你的结构看起来是:
用户
NSString name,
int age,
NSSet records, ...记录
NSDate date,
NSString name,
NSString event,
User user,
...然后,每次创建新记录,以及将记录添加到用户记录集时,也要在记录对象上设置用户。这将使获取记录变得更加容易,而且它还允许核心数据保持数据完整性:
"You should typically model relationships in both directions, and specify the inverse
relationships appropriately. Core Data uses this information to ensure the consistency of the
object graph if a change is made"一旦设置完毕,您就可以轻松地通过调用record.user获得记录用户。
如果多个记录需要多个用户,那么只需将关系设置为多个关系,并将User user属性更改为NSSet user。
如果你不想改变你的模型这么多,那么我有点困惑你的问题。你说你想为给定的用户获取记录?如果是这样的话,那么为什么不直接调用user.records,因为您已经定义了这种关系?不需要一个完整的获取请求,让核心数据为您管理这个请求。
如果您想要根据日期过滤结果记录,您可以自己对结果数组应用一个谓词,这同样不需要获取请求。
https://stackoverflow.com/questions/14079458
复制相似问题