核心数据多对多关系。保存字符串数组

时间:2013-02-23 12:06:17

标签: ios objective-c core-data

我有一个GameData实体,用于存储字符串数组。所以我创建了一个'Value'实体,它有一个值字符串属性,并在两个实体之间建立了多对多的关系。

要保存数据,请使用以下代码:

//Save values
NSMutableSet* values = [[NSMutableSet alloc] init];
for(NSString* n in gameData.values){
    NSManagedObject *val = [NSEntityDescription
                               insertNewObjectForEntityForName:@"Value"
                               inManagedObjectContext:context];
    [val setValue:n forKey:@"value"];
    [values addObject:val];
}
[gd setValue:values forKey:@"values"];

gameData.values数组当前是空的,因此代码实际上从未进入for循环...但由于某种原因,它在此行[gd setValue:values forKey:@"values"]崩溃并出现以下错误。

-[__NSSetM managedObjectContext]: unrecognized selector sent to instance 0x1f0485d0

我在哪里或如何将managedObjectContext选择器发送到我的值NSMutableSet ??

2 个答案:

答案 0 :(得分:1)

也许您需要检查您的实体的类型是否为#34; To Many"。 enter image description here

答案 1 :(得分:0)

我无法评论,这就是为什么我要创建一个答案。

为什么不使用xcode为您的实体创建子类并导入其头文件并使用如下代码

    //Save values
    //NSMutableSet* values = [[NSMutableSet alloc] init]; -- No Need of this

    for(NSString* n in gameData.values){
        Value *val = [NSEntityDescription
                                   insertNewObjectForEntityForName:@"Value"
                                   inManagedObjectContext:context];
        [val setValue:n];  // set your string
        [val setGame:gd]; //  set the game relation here. you can do this, if you have 

配置反向关系。如果没有创建反向关系,那将会有所帮助。

    } 
    //[gd setValue:values forKey:@"values"]; you don't need this.

现在只需保存上下文。一切都应该没问题。这比你的方式更清洁。我从来没有使用键值来访问核心数据实体属性,因为它必须记住属性的确切拼写会让人感到困惑和容易出错,如果你使用了错误的拼写或错误的键,它就不会抛出任何错误。

我认为你应该看看core data programming guide

编辑:如果您的GameEntity存储字符串数组,那么一对多的关系就足够了。只有当GameEntity有很多字符串和每个字符串,即Value实体也有许多GameEntity时,你需要多对多。在这种情况下,上面的代码稍有变化。

而不是

[val setGame:gd];

您需要使用

[val addGameObject:gd];