【问题标题】:Can I use Core Data fetched properties to return the most recent entity?我可以使用 Core Data 获取的属性来返回最新的实体吗?
【发布时间】:2014-08-02 16:06:26
【问题描述】:

我有两个具有这样关系的实体...

我想在对话上创建一个 fetched 属性以返回属于它的最新消息。我不想维持另一种关系,因此获取属性似乎是可行的方法。

所以这归结为;

如何将获取的属性限制为一项?

如何按时间戳对项目进行排序?

【问题讨论】:

  • 这是非常基本的,你需要给你添加一个NSSortDescriptorNSFetchRequest
  • 我认为使用了获取的属性而不是 NSFetchRequest。 (例如NSArray *array = conversation.fetchedProperty;
  • 我明白了,我误解了你的问题。我不知道是否或如何使用 fetchedProperties。
  • 没问题。如果您认识任何可能的人,我将不胜感激。

标签: ios iphone ipad core-data


【解决方案1】:

您可以使用获取的属性来解决该问题,但有一个问题。

不能在模型编辑器中定义获取的属性。

可以在代码中定义获取的属性。

所以是的,你可以做到,但价值非常低。

更新

您有在代码中定义获取属性的示例吗?我会在哪里做这个? managedObjectModel?

是的,您可以通过NSManagedObjectModel 进行此操作。

  1. 您必须先进行编辑,然后才能将模型添加到 NSPersistentStoreCoordinator。只要将NSManagedObjectModel 添加到NSPersistentStoreCoordinator,它就会变得不可变。

  2. 你抓住你关心的实体,然后创建一个NSFetchedPropertyDescription

  3. NSFetchedPropertyDescription 添加到现有实体。

  4. NSFetchRequest 添加到创建的NSFetchedPropertyDescription

完成后,您可以像往常一样使用NSManagedObjectModel。除了必须触及不寻常的模型之外,这非常简单。你做事的顺序很重要。举个例子:

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
ZAssert(mom, @"%@:%@ No model to generate a store from", [self class], NSStringFromSelector(_cmd));

//Inject a fetched property
NSEntityDescription *parentEntity = [mom entitiesByName][@"Parent"];

NSFetchedPropertyDescription *fetchedProperty = [[NSFetchedPropertyDescription alloc] init];
[fetchedProperty setName:@"lastTestEntity"];

NSMutableArray *properties = [[parentEntity properties] mutableCopy];
[properties addObject:fetchedProperty];
[parentEntity setProperties:properties];

NSFetchRequest *testEntityRequest = [[NSFetchRequest alloc] init];
[testEntityRequest setEntity:[mom entitiesByName][@"TestEntity"]];
[testEntityRequest setPredicate:[NSPredicate predicateWithFormat:@"parent == $FETCH_SOURCE"]];
[testEntityRequest setFetchLimit:1];

NSSortDescriptor *sortByDate = [NSSortDescriptor sortDescriptorWithKey:@"createDate" ascending:NO];
[testEntityRequest setSortDescriptors:@[sortByDate]];

[fetchedProperty setFetchRequest:testEntityRequest];

NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
ZAssert(coordinator, @"Failed to initialize coordinator");

请注意,在将NSFetchedProperty 添加到NSEntityDescription 之后,我是如何设置NSFetchRequest 的。如果您之后不设置它,您将收到来自 Core Data 的错误。雷达已提交,但我怀疑很少有人看过这些东西,更不用说针对奇怪行为提交雷达了。

【讨论】:

  • 您有在代码中定义获取属性的示例吗?我会在哪里做这个? managedObjectModel?
  • 你是怎么知道的?我没有找到任何文件。顺便说一句,在模型编辑器中,我可以向实体添加一个获取的属性,但是我们唯一可以设置的是“谓词”,它接受一个字符串 - 所以我们不能在那里进行排序吗?而且,生成要编码的实体(编辑器>创建 NSM...子类...)不会为访问获取的属性创建可见属性。所以我什至不知道如何获取它,但从现在开始通过查看您的示例代码来尝试理解。
  • 我是通过实验学习的。模型编辑器非常有限并且不是很有用。至于使属性可见,这种方式与模型编辑器一样可见。它仍将被定义为NSManagedObject 上的@dynamic 属性。什么都不会改变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多