核心数据 - 获取多对多关系的对象ID而不会触发故障

时间:2011-10-01 09:50:54

标签: iphone cocoa-touch ipad core-data

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

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

我也尝试过以下结果,结果相同:

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

我现在也尝试了以下内容,但不幸的是文章错误仍然存​​在:

for (Article *article in word.articles) {

   [articleIDs addObject:article.objectID];
}

任何帮助都将非常感谢!

4 个答案:

答案 0 :(得分:3)

这可以在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。

答案 1 :(得分:1)

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

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

设置resultType = NSManagedObjectIDResultType,正如Ashley在回答中所说。

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

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

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

答案 2 :(得分:0)

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

request.resultType = NSManagedObjectIDResultType

如果问题是多个错误触发(因此有多个SQL请求),那么获取所有最初所需文章的提取请求如何,这意味着只有一个SQL请求是吗?

答案 3 :(得分:0)

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

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

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