回答

收藏

核心数据:3表联接?

技术问答 技术问答 199 人阅读 | 0 人回复 | 2023-09-14

我知道核心数据不是数据库,并且有很多差异。是这个吗?
/ ~% K8 C5 i# x% b# b" C/ c1 [在数据库中,我通常有以下内容( |4 h; X3 L# @2 k% J8 o" Z$ g2 O
A->> B->> C1 n  F+ a' E4 r+ l9 j( C" L5 @- J
“ A”有很多“ B”,其中有很多“ C”2 |5 B& }; O. [0 O5 ], [
查询“给我所有具有c.attr =’X’的A可以很容易地写成:2 {8 U. ~# U1 w! `
select * from a, b, c where a.id = b.aid and b.id = c.bid and c.attr = 'X'
3 i' ?" f1 T. G, K* f) D在Core Data中,我想做同样的事情,但是要使用类似这样的谓词:
% j6 M+ E9 l6 j6 E5 d( k2 |; ]* ZNSPredicate *predicate = " ]2 E' _% l" q" D2 A5 E
  [NSPredicate predicateWithFormat"ANY bs.cs.attr = %@", "X"];
6 ?) q0 e0 k0 {[frequest setEntity:entityA];
* W! M% i: G# `) r! l/ V[frequest setPredicate:predicate];
2 [. |( \( u0 ~" `7 p5 [, D) ^这样做会导致错误:“ NSInvalidArgumentException”,原因:“此处不允许使用多对多键”/ V3 z' ?$ X, q( J; s7 R
我的解释正确吗,意思是什么数据库都限制了多表联接?7 y! K- z2 W9 ~" r: f5 u) @
我四处搜寻,找不到明确的答案。  U- t5 P) B4 G9 B; V- ]; {( ]/ O
我当前对该查询的解决方案如下:
2 ?2 n& O5 R& s  kNSPredicate *predicate = + o" Y5 m5 N! z: q! r% _* p
  [NSPredicate predicateWithFormat"ANY cs.attr = %@", "X"];& T8 o( `& c5 p9 }. B) S9 h$ G
...
; O$ n3 `  m" S/ t. i! `+ s# \NSArray *bs = //execute fetch
) ^$ Z) {- g0 H4 ^5 u* J3 kfor (B *b in bs) {
4 @; h  M, i' [  i! }3 [  //add b.a into an array! l3 V" ^" ~6 _5 U8 V
}
2 d) J' l" ~: @  X3 M# [//return array% v' G2 E) W2 O3 S* b" I9 ^4 a& e3 l
有没有更好的办法?预先感谢您的考虑。, o6 ]; J% d% q, W8 r2 @
                ) {' L/ u( v- S- D
解决方案:
$ X1 T, h3 _& a# l0 n3 U/ }               
7 q" j9 C# [7 w1 b- w) }# D  u3 x2 g7 p$ M0 n5 @
# T$ ~! V) ~' I4 H$ E
                您对此倒退了。  G( ?8 Q& v  K* c: f
首先,您不需要Core Data中的链接ID,因为所有相关对象已通过该关系链接。这意味着where a.id = b.aid and b.id =! X8 G% X( K% F, M, V
c.bid根本不需要类似的构造。1 Y" _; L9 U$ A/ W1 l7 C
其次,通常为接收定义测试的实体设置获取实体。在这种情况下,就是c.attr="X"这样,您将提取实体设置为C,则谓词应类似于:$ R$ y) u$ p# D& [
NSPredicate *p=[NSPredicate predicateWithFormat"attr=%@",xValue];' b' U2 a. |1 @! f; m
这将返回所有C符合测试条件的实例的数组。然后找到任何特定的问题B或A只是寻求每个关系的问题C。2 w: l0 v) S8 r5 ~9 _
如果您的逆关系是一对一的,例如A > B > C,则您只要求每个都C提供b.aso的值:- A9 X* @& N! i
AObject *anA = aCinstance.b.a;4 h: i$ e; M& M) C
重要的是要记住您不在这里处理表。您正在处理对象图。您将提取设置为特定实体,然后遍历过滤后的实体之间的关系。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则