这是一个谜:

我在setPrimitiveValue:forKey:上调用NSManagedObject。关键是对象的合法,持久的建模属性。但是,setPrimitiveValue:forKey:失败,通常为另一个任意属性设置值。文档说,为未建模的 key 调用setPrimitiveValue:forKey:时,这种行为是预期的。因此,Core Data似乎认为 key 是未建模的。

奇怪的部分:

当键被硬编码为字符串文字时,原始值的设置确实成功。仅当键是变量时,它才会失败。我正在使用的变量恰巧是从keyPathobserveValueForKeyPath:ofObject:change:context:参数传递的
keyPath变量与字符串文字相同。 isEqual:返回true,并且哈希值相等。 keyPath变量的类型为__NSCFString。有谁知道setPrimitiveValue:forKey:为什么会有不同的表现? (此行为在OS X 10.9.1上)

包含更好信息的更新:

行为不当的 key 可追溯到从磁盘上的文件加载的字符串。下面的示例是一个孤立的案例。如果将属性字符串“mainAttr”写入磁盘并读回,则setPrimitiveValue:forKey:会设置错误属性的值,而不是“mainAttr”。

核心数据对象:

@interface Boo : NSManagedObject
@property (nonatomic, retain) NSNumber * mainAttr;
@property (nonatomic, retain) NSNumber * attr1;
@property (nonatomic, retain) NSNumber * attr2;
@property (nonatomic, retain) NSNumber * attr3;
@end

--
#import "Boo.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
            NSManagedObjectContext *context = managedObjectContext();
    NSString *key = @"mainAttr";

    // write to disk, read back in
    NSString *path = [@"~/Desktop/test.txt" stringByExpandingTildeInPath];
    [key writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:NULL];
    key = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL];

    Boo *boo = [NSEntityDescription insertNewObjectForEntityForName:@"Boo" inManagedObjectContext:context];
    [boo setPrimitiveValue:@(5) forKey:key];

    NSLog(@"Boo: %@", boo);
    }
    return 0;
}

最佳答案

您需要以下3条语句来设置值。试试吧。

[self willChangeValueForKey:key];
[boo setPrimitiveValue:@(5) forKey:key];
[self didChangeValueForKey:key];

关于ios - 核心数据: setPrimitiveValue:forKey: behaves really weirdly,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20668250/

10-11 01:22