【问题标题】:Core Data - Get objectIDs of to-many relationship without firing a fault核心数据 - 在不触发错误的情况下获取对多关系的 objectID
【发布时间】:2023-03-12 13:32:01
【问题描述】:

我有一个具有一对多关系的实体。从我的实体中获取对象的子集后,我想获取关系对象的 ManagedObjectID - 而不会触发错误。这可能吗?我从文档中的理解是,在错误上调用 objectID 不会导致它触发,但是当我尝试以下行时,仍然会为每个对象的关系触发一个错误:

[word.articles valueForKeyPath:@"objectID"];

我也尝试了以下方法,结果相同:

[word valueForKeyPath:@"articles.objectID"];

我现在也尝试了以下方法,但不幸的是文章故障仍然存在:

for (Article *article in word.articles) {

   [articleIDs addObject:article.objectID];
}

任何帮助将不胜感激!

【问题讨论】:

  • 没有错误发生——所发生的只是一个错误被触发,这意味着去商店旅行,并且处理时间显着增加

标签: iphone cocoa-touch ipad core-data


【解决方案1】:

这在 iOS 8.3 中成为可能

/* returns an array of objectIDs for the contents of a relationship. 
   to-one relationships will return an NSArray with a single 
   NSManagedObjectID.  Optional relationships may return an empty 
   NSArray. 
   The objectIDs will be returned in an NSArray regardless of the type 
   of the relationship.  */
- (NSArray<NSManagedObjectID *> *)objectIDsForRelationshipNamed:(NSString *)key NS_AVAILABLE(10_11,8_3);

它会去商店一趟以获取所有 ID。

【讨论】:

    【解决方案2】:

    您需要做的是使用这样的谓词为 Articles 实体创建一个 NSFetchRequest(其中 'word' 是一个单词管理对象):

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(ANY words == %@)", word];
    

    设置 resultType = NSManagedObjectIDResultType 正如 Ashley 在他的回答中所说的那样。

    然后,获取请求将返回包含指定单词的文章的文章 ObjectID 集合。

    OR:如果您想通过单词的文本查找而不是首先将其作为托管对象获取,则使用这样的谓词。 (其中 'wordText' 是一个 NSString 并假设 - 'text' 是 Word 实体的一个字段)

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(ANY words.text == %@)", wordText];
    

    【讨论】:

    • 不幸的是,这不是一个选项,因为它要求所有文章的所有单词都与正在搜索的单词匹配。该数据库包含数千篇文章,每篇文章包含数百个单词。
    • 我假设“运行循环”正在尝试查找包含给定单词的所有文章。添加新文章时,文章中的每个单词都被添加为“单词”实体并建立关系。这是与数据库有关的相当典型的事情。如果不是这种情况,那么 Run Loop 需要更详细地解释他想要实现的目标。
    • @Robin - 这正是我想要做的。
    • @RunLoop 好。那么,我回答了你的问题了吗?
    • 不,但在您的评论中,您肯定了我关于为什么您的答案不是一个选项的评论。
    【解决方案3】:

    我认为您可能必须使用 NSFetchRequest,用于实体文章和设置

    request.resultType = NSManagedObjectIDResultType
    

    如果问题是 多个 故障触发(因此多个 SQL 请求),那么提取请求如何最初提取 所有 您需要的文章,这意味着只有一个 SQL 请求是造出来的?

    【讨论】:

    • 问题是我不知道要在请求中包含哪些文章 - 要知道我必须查询 word.articles,这会引发错误并使我们回到我的问题,如上所述
    【解决方案4】:

    一种可能性是执行预取,以便在初始提取期间提取您的关系对象,因此以后不会导致错误。

    查看NSFetchRequest 类中的relationshipKeyPathsForPrefetching 属性。下面是一个示例,其中request 返回一个包含articles 属性的Word 对象数组:

    [request setRelationshipKeyPathsForPrefetching:@[@"articles"]];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      • 2021-06-10
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      相关资源
      最近更新 更多