2012-02-19 51 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