[英]Get related / associated entities from NSSet - CoreData
I have 2 autogenerated entities : 我有2个自动生成的实体:
@interface ContactEntity : Entity
@property (nonatomic, retain) NSString *caption;
@property (nonatomic, retain) NSString *image;
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSString *text;
@property (nonatomic, retain) NSSet *pointLink;
@end
@interface PointEntity : Entity
@property (nonatomic, retain) NSNumber *latitude;
@property (nonatomic, retain) NSNumber *longitude;
@property (nonatomic, retain) NSSet *entityLink;
@property (nonatomic, retain) EntityEntity *entityTypeLink;
@end
They are linked between each other as ManyToMany, ie one contact has many points, one point has many contacts inside. 它们之间的链接就像ManyToMany,即一个联系人有很多点,一个点内部有很多联系人。
Then ai get first entity : 然后ai得到第一个实体:
ContactModel *contact = [[[ContactModel alloc] init] autorelease];
// this is FetchRequest, returns array of all entities
self.items = [contact list:contact];
// i get only one, all is OK here, this entity has related PointEntity in DB
ContactEntity *contactEntity = [self.items objectAtIndex:self.selection];
And when i try to get related PointEntity using NSSet in selected ContactEntity i always get NULL or empty array. 当我尝试在选定的ContactEntity中使用NSSet获取相关的PointEntity时,我总是会得到NULL或空数组。 Neither of this works : 这两个都不起作用:
NSArray *points = [contactEntity.pointLink allObjects];
PointEntity *pointEntity = [contactEntity.pointLink anyObject];
NSInteger x1 = [points count]; // always 0
id x2 = pointEntity.latitude; // always 0
for (PointEntity *x in contactEntity.pointLink) // isn't enumerated because count = 0
{
id x3 = x.latitude;
}
Any thoughts are appreciated. 任何想法表示赞赏。 Did i miss something, maybe i need to use NSPredicate to select entities from PointEntity that are related to ContactEntity? 我是否错过了某些事情,也许我需要使用NSPredicate从PointEntity中选择与ContactEntity相关的实体?
Thanks. 谢谢。
PS My question is similar to this but that suggestion does not work for me, i cannot get loaded associated entities using NSSet of main entity :( CoreData: many-to-many relationship PS我的问题与此类似,但该建议对我不起作用,我无法使用主要实体的NSSet加载关联的实体:( CoreData:多对多关系
Answer is found ... i tried to use property of the autogenerated entities when created new records in CoreData, in the meantime the correct way is to use generated methods like - addPointLinkObject, addEntityLinkObject, etc 找到答案了...我在CoreData中创建新记录时尝试使用自动生成的实体的属性,与此同时,正确的方法是使用生成的方法,例如-addPointLinkObject,addEntityLinkObject等
Example, i have 3 tables : 例如,我有3张桌子:
Contacts (one person may have many locations)
<< - >>
Points (one location can contain many people)
<< - >
EntityTypes (just a type of a location, in this case type is CONTACT)
One of the entities autogenerated by xCode : 由xCode自动生成的实体之一:
@interface PointEntity : Entity
@property (nonatomic, retain) NSNumber *latitude;
@property (nonatomic, retain) NSNumber *longitude;
@property (nonatomic, retain) NSSet *entityLink; // reference to Contacts table (ManyToMany)
@property (nonatomic, retain) EntityEntity *entityTypeLink; // reference to EntityType table (OneToMany)
@end
@interface PointEntity (CoreDataGeneratedAccessors)
- (void)addEntityLinkObject:(ContactEntity *)value;
- (void)removeEntityLinkObject:(ContactEntity *)value;
- (void)addEntityLink:(NSSet *)values;
- (void)removeEntityLink:(NSSet *)values;
@end
I tried to do the following : 我尝试执行以下操作:
// create 3 new instances - one for each entity
ContactEntity *contactEntity = [model create:model];
PointEntity *pointEntity = [point create:point];
EntityModel *entity = [[[EntityModel alloc] init] autorelease];
entity.name = model.table;
EntityEntity *entityEntity = [[entity list:entity] objectAtIndex:0];
// then i tried to use entity's properties directly to bind entities
// it works, but it works only on DB level when we add new records, but somehow something was missed and thus such selection did not work later - [pointEntity allObjects]
//pointEntity.entityTypeLink = entityEntity; // WRONG !!!
//pointEntity.entityLink = contactEntity.pointLink;
//contactEntity.pointLink = pointEntity.entityLink;
// then i replaced 3 lines above with these ones
[pointEntity addEntityLinkObject:contactEntity]; // CORRECT !!!
[contactEntity addPointLinkObject:pointEntity];
[entityEntity addPointLinkObject:pointEntity];
[context save]; // save changes made with entities in current CoreData context
// now [pointEntity allObjects] and [pointEntity anyObject] work as expected
Useful links - 有用的链接-
Coredata and Generated subclass for NSManagedObject with relations 具有关系的NSManagedObject的Coredata和生成的子类
https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdAccessorMethods.html#//apple_ref/doc/uid/TP40002154 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdAccessorMethods.html#//apple_ref/doc/uid/TP40002154
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.