この質問に答えるために、これら 2 つのオブジェクト間に 1 対 1 の関係を作成する方法をモデル化し直し、以下に例を示しました。
この問題は、Objective-c には型付き配列のようなものがないという事実から生じます。ある場合は、インターフェイスの仕組みを再実装することを検討します。
メンバーはグループに属しているため、Group オブジェクトをメンバーに移動し、Group オブジェクトに members メソッドを追加して、子オブジェクトをさかのぼって調べます。
@interface Member : DBObject
@property (strong) NSString* firstname;
@property (strong) NSString* lastName;
@property (strong) Group* group;
@end
@interface Group : DBObject
@property (strong) NSString* groupName;
@property (strong) NSString* adminName;
- (DBResultSet*)members;
@end
そして、実装は次のようになります。
@implementation Member
@dynamic firstname,lastName, group;
@end
@implementation Group
@dynamic adminName, groupName;
- (DBResultSet *)members {
/* we achieve one-to-many relationships by querying the objects in the
manner a relational database would commonly be structured */
return [[[Member query] whereWithFormat:@"group = %@", self] fetch];
}
- (void)entityDidDelete {
/* when you create tight bonds, you may well wish to create 'trigger' methods
to clean data and keep the integrity in good order */
for (Member* member in [[[Member query] whereWithFormat:@"group = %@", self] fetch]) {
member.group = nil;
[member commit];
}
}
@end
これで、プロパティ タイプとして配列を作成し、その中に Id 値を格納することを妨げるものは何もありません。しかし、それはそれほどきれいではなく、それを維持する必要がありますが、FK 値を探している場合、これは維持を必要とせず、ハイドレートする必要なしに、他のオブジェクトに関連している場合にオブジェクトの削除を停止する素敵なロジックを作成できます。たくさんのオブジェクトを調べてから、配列の中を調べます。
さらに、オブジェクトのドット表記を使用して、Person オブジェクトから厳密に型指定された関係をナビゲートするという美しいオプションを利用できます。
NSString* admin = person.group.adminName;
また、Group オブジェクトを Member に追加すると、次のようになります。
@property (strong) Group* group;
DBAccess は、グループプロパティの SQLite にインデックスを自動的に作成し、この方法でリンクされたオブジェクトはアクセスされる可能性が高いため、キャッシュ内でその重要性を優先します。
これが役に立てば幸いです、エイドリアン