我有一个与多对多关系的实体。从我的实体获取对象的子集后,我想获得关系对象的ManagedObjectIDs - 而不会触发错误。这可能吗?我从文档中理解的是,在一个错误上调用objectID并不会导致它被触发,但是当我尝试以下行时,会为每个对象的关系触发一个错误:
[word.articles valueForKeyPath:@"objectID"];
我也尝试过以下结果,结果相同:
[word valueForKeyPath:@"articles.objectID"];
我现在也尝试了以下内容,但不幸的是文章错误仍然存在:
for (Article *article in word.articles) {
[articleIDs addObject:article.objectID];
}
任何帮助都将非常感谢!
答案 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"]];