0

我在互联网上搜索了很多,但找不到我要找的东西。

我有这个模型,它可能有很多用户。所以我有一个名为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 获取用户。

4

4 回答 4

2

我假设您的模型大致如下所示,即记录关系具有称为用户的反向关系:

用户记录模型

重要的是,这种关系是反向关系,否则 Core Data 不会自动维护它。然后,您可以在给定日期/之后查询给定用户的所有记录,如下所示:

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);

我已将您的代码重写为更紧凑,但重要的变化是这将一次性创建查询。

于 2014-02-21T14:35:26.633 回答
1

错误在这里:

[fetchRequest setPredicate:predicates];
[fetchRequest setPredicate:predicate];

设置复合谓词后,您用谓词 for only 覆盖它date。您可能想删除第二行。

编辑:获取请求要求您已经定义了一个反向关系user,并在谓词RecordUser使用该关系的确切名称。

另一种解决方案是使用 to 的“前向”关系UserRecord过滤结果:

NSSet *records = [currentUser.records filteredSetUsingPredicate:predicates];

或者,如果您更喜欢数组

NSArray *records = [[currentUser.records allObjects] filteredArrayUsingPredicate:predicates];
于 2012-12-29T07:09:59.933 回答
1

正如 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,因为您已经定义了这种关系?不需要整个获取请求,让核心数据为您管理那个。

如果您想根据日期过滤结果记录,您可以自己将谓词应用于结果数组,同样无需获取请求。

于 2012-12-29T07:32:27.400 回答
0

我找到了我搜索的内容!我只需要使用这个来形成一个谓词

NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"SELF = %@",delegate.currentUser]; 

编辑

好吧,看来我错了:/那似乎只管用。

于 2012-12-29T08:04:21.470 回答