【问题标题】:How to put a NSMutableArray into an entity (NSManagedObject) attribute?如何将 NSMutableArray 放入实体(NSManagedObject)属性中?
【发布时间】:2012-07-05 11:09:39
【问题描述】:

我定义了一个名为“地图”的实体。它具有三个属性:

scale :带有 NSFormatter 的 NSNumber(如果你想要一个 NSNumber 而不是 NSString,则必须使用它,>bangs

单位:NSString

mapData:二进制数据?转化价值?

此 mapData 属性会导致问题。我有一个自定义 NSView(“矩阵”属性),它将一些引用存储到 NSMutableArray 中。这是我要放入 mapData 属性的数组。但这不起作用:

[[[mapController arrangedObjects]lastObject] setValue:[matrix colorReference]forKey:@"mapData"];

忽略除此之外的所有内容: “lastObject”:是(单个)地图实体。 [matrix colorReference] 是(属性)NSMutableArray。

现在,为了简化:我希望 NSMutableArray 成为 Map 实体的“mapData”属性,在保存文档时存储,然后检索并传输到自定义视图。设计很清晰,做起来的方法要少得多……

请帮帮我。

【问题讨论】:

  • 我没有收到错误,只是放入的 NSArrayController 然后从

标签: objective-c core-data


【解决方案1】:

您可以通过将属性 Binary Data 类型设置为基本上为NSData * 类型,将其序列化和排列并存储在Core Data 中。

然后使用 NSKeyedArchiver 将您的数组序列化为 NSData。

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:myArray];

然后使用NSKeyedUnarchiver返回NSArray:

NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:myData];

【讨论】:

  • 我认为 Core Data 在将属性设置为“可转换”时提供了序列化,我错了吗?它适用于 RTFD 和图像,而不适用于数组?
  • 如果使用可转换类型,则必须创建一个 NSValueTransformer 子类并重写类方法以提供从对象到 NSData 的转换和反向。这是更多的代码。
  • 你能发布你的代码吗?我很确定它是有效的,因为我自己就是这样将它用于 NSDictionary。
  • 我的意思是你 a) 设置你的 mapData 和 b) 你获取和读取你的 mapData 的代码。
  • 就是代码。那是错的吗? [[[mapController mappedObjects]lastObject] setValue:[matrix colorReference] forKey:@"mapData"];是我在代码数据中“存储”的方式。控制器中的“lastObject”是托管对象,“mapData”是它的属性。
【解决方案2】:

嗯,其实更简单。

Core Data 确实将 NSMutableArray 序列化为类型为“Transformable”的属性。转换当然是可逆的,所以我可以直接使用它来设置我的自定义视图的属性,只需:

[matrix setColorReference:[[mapController content]valueForKey:@"mapData"]];

其中“matrix”是 NSView,“colorReference”是 NSMutableArray 属性,“map controller”是存储 NSData 的实体,键为“mapData”。

对于反向操作(保存在文件中的编辑地图),我这样做:

[[mapController content] setValue:colorReference forKey:@"mapData"];

由于Core Data的属性是KVO兼容的,文件被标记为已编辑,当然也可以撤销!

为了保持对象之间的引用(控制器 --> 视图和反向),我只需在子类中使用 IBOutlet 属性,在 IB 中进行绑定,然后让框架完成其余的工作(比我做的更好)。

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多