2014-01-15 7 views
0

У меня проблема с Core Data - сохранение отношения к существующему объекту (UserData). Я хочу, чтобы сохранить несколько позиций для одного пользователя - Отношения Един (Пользователь) ко многим (Позиция)Создание отношений для существующего объекта в данных ядра

Это UserData:

@class ApiKey, Positions, SecretApiKey; 

@interface UserData : NSManagedObject 

@property (nonatomic, retain) NSString * password; 
@property (nonatomic, retain) NSString * username; 
@property (nonatomic, retain) NSNumber * id; 
@property (nonatomic, retain) ApiKey *apiKeyRelationship; 
@property (nonatomic, retain) NSSet *positionRelationship; 
@property (nonatomic, retain) SecretApiKey *secretApiKeyRelationship; 
@end 

@interface UserData (CoreDataGeneratedAccessors) 

- (void)addPositionRelationshipObject:(Positions *)value; 
- (void)removePositionRelationshipObject:(Positions *)value; 
- (void)addPositionRelationship:(NSSet *)values; 
- (void)removePositionRelationship:(NSSet *)values; 

Это Положение enitiy:

@class UserData; 

@interface Positions : NSManagedObject 

@property (nonatomic, retain) NSString * amount; 
@property (nonatomic, retain) NSString * base; 
@property (nonatomic, retain) NSNumber * id; 
@property (nonatomic, retain) NSString * pl; 
@property (nonatomic, retain) NSString * status; 
@property (nonatomic, retain) NSString * swap; 
@property (nonatomic, retain) NSString * symbol; 
@property (nonatomic, retain) NSString * timestamp; 
@property (nonatomic, retain) UserData *positionRelationship; 

@end 

Может кто-то объясните мне, как сохранить новую позицию существующего пользователя?

ответ

1

Простой. Предполагая, что userData является существующим объектом пользовательских данных в контексте, и position является существующим объектом позиции ...

NSMutableSet *stuff = [userData mutableSetValueForKey:@"positionRelationship"]; 
[stuff addObject:position]; 
// add more if you want. 

mutableSetValueForKey: использует KVC вернуть изменяемый объект прокси для этих отношений. Неважно, если вы (или генерация кода Xcode) объявляете связь как NSSet. Вы получаете изменяемый прокси-объект, делаете что-то с ним, а затем, когда вы сохраняете свой контекст, ваши изменения будут сохранены. Вы НЕ должны называть addPositionRelationshipObject: напрямую, то есть метод доступа к неупорядоченным наборам KVC. Измененный прокси-сервер вызывает это для вас, и вам не требуется его реализовать (они генерируются динамически).

Key Value Coding documentation больше о методах доступа к коллекции. Также Core Data Programming guide. В настоящее время они немного устарели, и основная документация по данным может немного вводить в заблуждение, когда дело доходит до манипулирования отношениями (они ссылаются на использование аксессуаров коллекции, а затем говорят, что вы имеете возможность напрямую обращаться к методам доступа. , используйте KVC, вы сэкономите массу неприятностей).

+0

Получил это: CoreData: error: Не удалось вызвать назначенный инициализатор в классе NSManagedObject 'UserData' в этой строке 'NSMutableSet * userSet = [user mutableSetValueForKey: @" positionRelationship "];' –

+0

Я выяснил, как это сделать с ответом данные @quellish. Спасибо за помощь. –

0

Предполагая userData является экземпляром UserData и p1, p2 являются экземплярами Position, то [userData addPositionRelationshipObject: p1];

[userData addPositionRelationshipObject: p2];

должен работать хорошо.

+0

или 'p1.positionRelationship = userData' –

+0

Это часть, которую я не понимаю. Если я использую '[userData addPositionRelationshipObject: p1];' , как основные данные будут знать, какой пользователь в UserData верен? –

+0

userData - это один экземпляр объекта «UserData» и как таковой userData представляет только одного пользователя и с '[userData addPositionRelationshipObject: p1];' вы добавляете отношение к экземпляру позиции к нему. – user3071962

Смежные вопросы