【问题标题】:Core Data: Two Different Ways to Access Attributes, Only One Works核心数据:访问属性的两种不同方式,只有一种有效
【发布时间】:2010-10-11 17:21:10
【问题描述】:

对于下面的代码,在下面的两个注释之前的行中,只有第一个有效。

NSManagedObject * Event = [NSEntityDescription insertNewObjectForEntityForName:str inManagedObjectContext:app.managedObjectContext]; 
//Work but strange
[Event setValue:[NSNumber numberWithInt:buf4[v+h]] forKey:value]; 
 //Error
Event.value= [NSNumber numberWithInt:buf4[v+h]]; 

第二次返回和错误

request for member 'value' in 'Event', which is of non-class type 'NSManagedObject*'

【问题讨论】:

  • 您遇到的错误是什么?
  • 您好,Andrew H。您是该网站的新手。作为一个新用户,你应该明白,像这样表达的问题 - 没有任何可以帮助别人回答你的问题的细节,也缺乏你迄今为止试图解决它的细节 - 将导致非常低质量的答案,如果你得到任何答案。你应该改写这个问题(不要开始一个新问题,只需编辑这个问题)并使问题更清楚。
  • 示例代码包含许多未定义和不相关的变量,我们 StackOverflow 社区在分析此问题时必须挖掘过去。什么是 buf4,为什么它被总和 v+h 索引?最后,事实证明这并不重要,整个[NSNumber numberWithInt:buf4[v+h]] 可以替换为foo,这将使问题更容易阅读。
  • +1 我编辑了问题以使其清楚。实际问题相当好,所以其他人应该对编辑后的问题投票。

标签: iphone core-data key-value-coding nsmanagedobject


【解决方案1】:

在我们开始之前,重要的是要指出在 Objective-C 中编写代码时应该遵循一些约定。类名应以大写字母开头:EventNSManagedObjectMKMapView。变量应以小写字母开头:eventcurrentUsermyMapView

现在,解决您的问题。 [Event setValue:foo forKey:value]Event.value=foo(原文如此)并不相同,除非变量值是包含字符串 value 的 NSString。 (即NSString *value = @"value")更清楚地说,foo.bar=baz 等价于[foo setValue:baz forKey:@"bar"] 而不是[foo setValue:baz forKey:bar]

【讨论】:

    【解决方案2】:

    您看到的问题是由称为关联存储的 NSManagedObject 类的行为引起的。

    关联存储基本上将任何通用 NSManagedObject 转换为字典,其键是分配给它的实体的属性名称。您可以像为字典或任何其他键值兼容类设置和访问键值一样。因此,当您使用这样的通用托管对象时:

    NSManagedObject * Event = [NSEntityDescription insertNewObjectForEntityForName:str inManagedObjectContext:app.managedObjectContext]; 
    

    ...您将获得一个通用 NSManagedObject 实例,其中包含数据模型中定义的 str 实体的键。因此,当您可以使用键值编码将值存储在通用 NSManagedObject 实例中时:

    [Event setValue:[NSNumber numberWithInt:buf4[v+h]] forKey:value];
    

    或者更清楚的是:

    [Event setValue:[NSNumber numberWithInt:buf4[v+h]] forKey:@"anAttributeName"];
    

    但是,点表示法是不同的。当您调用Event.anAttributeName 时,您正在调用 NSManagedObject 的自定义子类中的方法。为了使其工作,您必须生成一个名为 Event 的自定义子类,并将其分配给数据模型中的 Event 实体。

    当您使用点表示法时,您调用的方法如下所示:

    -(void) setAnAttributeName:(NSNumber *) aNumber{
        //some boilerplate
        [self setPrimativeValue:aNumber forKey:@"anAttributeValue"];
        // some more boilerplate
    }
    

    您可以自己编写方法或使用@dynamic 编译器指令来完成,但无论哪种方式,您都必须拥有该方法。没有方法,没有点符号。

    当您刚刚学习 Core Data 时,最好使用通用的 NSManagedObjects 和 setValue:forKey: 继续使用自定义 NSManagedObject 子类。

    【讨论】:

      猜你喜欢
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多