2012-02-19 32 views
0

我有2个自动生成的实体:得到的NSSet相关/相关实体 - CoreData

@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 

它们之间相互联系的多对多,即一个接触有很多点,一个点有内多次接触。

然后,我得到第一个实体:

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]; 

,当我尝试在选择ContactEntity使用NSSet中获得相关PointEntity我总是得到空或空数组。这两个作品都没有:

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; 
} 

任何想法表示赞赏。我错过了什么,也许我需要使用NSPredicate从PointEntity中选择与ContactEntity相关的实体?

谢谢。

P.S.我的问题是类似的,但这个建议不适用于我,我不能使用主要实体的NSSet加载关联实体:( CoreData: many-to-many relationship

回答

0

答案被发现...我试图使用自动生成实体的属性时在CoreData创造了新的纪录,同时正确的方法是使用生成的方法一样 - addPointLinkObject,addEntityLinkObject等

例子,我有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) 

一个由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 

我试着做到以下几点:

// 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 

相关链接 -

Coredata and Generated subclass for NSManagedObject with relations

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdAccessorMethods.html#//apple_ref/doc/uid/TP40002154