我遇到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
有人可以解释一下如何为现有用户保存新职位吗?
答案 0 :(得分: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,你会省去很多麻烦)。
答案 1 :(得分:0)
假设userData
是UserData
的实例,而p1
,p2
是Position
的实例,那么
[userData addPositionRelationshipObject: p1];
[userData addPositionRelationshipObject: p2];
应该很好地工作。