2

我有一个 GameData 实体,用于存储字符串数组。因此,我创建了一个具有值字符串属性的“值”实体,并在两个实体之间建立了多对多关系。

为了保存数据,我使用以下代码:

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

4

2 回答 2

1

也许您需要检查您的实体类型是否为“To Many”。 在此处输入图像描述

于 2015-02-03T02:38:32.197 回答
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.

现在只需保存上下文。一切都应该没问题。这比你的方式干净得多。我从未使用键值来访问核心数据实体属性,因为它会令人困惑且容易出错,因为您必须记住属性的确切拼写,并且如果您使用了错误的拼写或错误的键,它不会引发任何错误。

我认为你应该看看核心数据编程指南

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

代替

[val setGame:gd];

你需要使用

[val addGameObject:gd];
于 2013-02-23T18:25:33.910 回答