Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
966 views
in Technique[技术] by (71.8m points)

iphone - Core Data Many-to-Many Relationship NSPredicate

I have a data model with a many-to-many relationship like EntityA <-->> EntityB <<--> EntityC. I used to query EntityA with different search criteria and I use NSCompoundPredicate with an array of NSPredicates. On one of the predicate I wanted to query EntityA using EntityC. I tried to use the following SUBQUERY but it did not work.

searchPredicate=[NSPredicate predicateWithFormat:@"(0 != SUBQUERY(EntityB, $B, (0 != SUBQUERY($B.EntityC, $EntityC, $EntityC.name like %@).@count)).@count)", name]

And I got the following exception,

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason:
'Can't perform collection evaluate with non-collection object.'

Is there anything I'm missing. I would appreciate any help.

Sarah

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

(I had a lot of trouble puzzling out your predicate so take this with a grain of salt.)

I think your making this overly complicated. You should simplify with keypaths. Each EntityB has a to-one relationship to a EntityC so to search on EntityB objects all you need to do is check EntityB.entityCRelationshipName.entityCAttribute. So something like:

ALL B.EntityC.name like %@

In any case, (if I'm reading the predicate correctly) this:

SUBQUERY($B.EntityC, $EntityC, $EntityC.name like %@)

can only return a single object instead of a collection. Therefore, the predicate will not be able to perform a count on it. That is what your error message means.

I suggest using the predicate editor in the Data Model editor to hash out the predicates before you store them.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...