首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用核心数据获取数据

使用核心数据获取数据
EN

Stack Overflow用户
提问于 2012-12-29 06:55:07
回答 4查看 1.4K关注 0票数 0

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

我有一个模型,它可能是很多用户。所以我有一个叫做User的实体。用户拥有记录的NSSet。我想从给定的用户那里获取记录。我试图这样做,但它仍然返回所有用户的记录。

代码语言:javascript
复制
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,它包含:

代码语言:javascript
复制
NSString name,
int age,
NSSet records, ...

Record有自己的属性,如:

代码语言:javascript
复制
NSDate date,
NSString name,
NSString event, 
...

我想要形成一个获取请求,只从特定用户获取记录。我不知道怎么做,因为我从每个用户那里得到了所有的记录。

唱片有很多种关系。我可以获得像currentUser.records这样的记录,但是我不能让用户使用record.User。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-29 07:09:59

错误在这里:

代码语言:javascript
复制
[fetchRequest setPredicate:predicates];
[fetchRequest setPredicate:predicate];

在设置复合谓词之后,只为date覆盖它。您可能要删除第二行。

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

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

代码语言:javascript
复制
NSSet *records = [currentUser.records filteredSetUsingPredicate:predicates];

或者,如果你喜欢数组

代码语言:javascript
复制
NSArray *records = [[currentUser.records allObjects] filteredArrayUsingPredicate:predicates];
票数 1
EN

Stack Overflow用户

发布于 2014-02-21 14:35:26

我假设您的模型大致如下所示,即记录关系有一个名为user的逆关系:

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

代码语言:javascript
复制
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);

我已经重写了您的代码,使其更加紧凑,但重要的更改是,这将在一次操作中创建查询。

票数 2
EN

Stack Overflow用户

发布于 2012-12-29 07:32:27

正如Martin R所说,您正在替换您的谓词。正如他还提到的,用户属性应该是小写的,因为我非常肯定核心数据会强制这样做。如果您尝试用大写字母创建关系,它会给您一个错误,所以请尝试

代码语言:javascript
复制
NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"user = %@",currentUser];

而不是。显然,如果您的模型没有为用户定义一个属性,那么它也不会工作,您需要将其更改为您的模型实际拥有的任何属性,但这应该有效。

编辑:

尝试在模型中添加一个逆关系。所以你的结构看起来是:

用户

代码语言:javascript
复制
NSString name,
int age,
NSSet records, ...

记录

代码语言:javascript
复制
NSDate date,
NSString name,
NSString event, 
User user,
...

然后,每次创建新记录,以及将记录添加到用户记录集时,也要在记录对象上设置用户。这将使获取记录变得更加容易,而且它还允许核心数据保持数据完整性:

代码语言:javascript
复制
"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,因为您已经定义了这种关系?不需要一个完整的获取请求,让核心数据为您管理这个请求。

如果您想要根据日期过滤结果记录,您可以自己对结果数组应用一个谓词,这同样不需要获取请求。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14079458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档