将 NSManagedObject 存储在字典中(NSDictionary)

Posted

技术标签:

【中文标题】将 NSManagedObject 存储在字典中(NSDictionary)【英文标题】:Storing NSManagedObject in a dictionary (NSDictionary) 【发布时间】:2011-04-14 14:02:06 【问题描述】:

我有一个自定义类,它是NSManagedObject 的子类。我想将其存储在字典中,但在尝试这样做时收到Property list invalid for format: 200 错误。

这是我尝试创建字典的方法:

NSDictionary *dictionary = 
    [NSDictionary dictionaryWithObject: voiceMemo forKey:@"voiceMemo"];

尝试时结果相同

NSDictionary *dictionary = 
    [NSDictionary dictionaryWithObject: (NSData *) voiceMemo forKey:@"voiceMemo"];

但是,当尝试单独保存各个属性时,它可以工作:

NSDictionary *dictionary = 
    [NSDictionary dictionaryWithObject: voiceMemo.attribute forKey:@"attribute"];

NSDictionary 应该能够存储数据对象,所以我猜,真正的问题是如何将NSManagedObject 对象转换为NSData

【问题讨论】:

【参考方案1】:

您确定在创建字典时会发生错误,就像您发布的代码所暗示的那样?

Property list invalid for format: 200 听起来像是您尝试将NSManagedObject 写入文件系统。这是行不通的,因为NSManagedObjects 不确认NSCoding

您可以将 NSManagedObject 的属性保存在 NSDictionary 中,并将此字典保存到文件中。..

NSArray *keys = [[[myObject entity] attributesByName] allKeys];
NSDictionary *dict = [myObject dictionaryWithValuesForKeys:keys];

当你想恢复它时,你可以像这样设置你的 managedObject 的值:

[myObject setValuesForKeysWithDictionary:dict];

【讨论】:

你是对的,错误发生在下一行,当我试图写入数据时(在本例中是 UILocalNotification 的 userData)。正如我在问题中所写,单独保存属性确实有效,因此可以解决问题。我只是认为(或希望)有办法解决这个问题。谢谢! 我在 Google 上搜索了获取键数组,NSArray *keys = [[[myObject entity] attributesByName] allKeys];比其他答案最好谢谢! @Matthias 我应该如何在同一个字典中获取关系对象?【参考方案2】:

在我的应用程序中,我还将 MO 存储在字典中(但不要坚持,我存储在数组中)但没有任何演员表。如果数组也发生这种情况,请尝试。

您可以尝试先创建字典,然后再分配对象。

NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setValue:managedObject forKey:@"thisOne"];

【讨论】:

【参考方案3】:

一个快速版本,以防万一有人需要它

import CoreData 
extension NSManagedObject 
    func toDict() -> [String:Any] 
        let keys = Array(entity.attributesByName.keys)
        return dictionaryWithValues(forKeys:keys)
    

【讨论】:

以上是关于将 NSManagedObject 存储在字典中(NSDictionary)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NSManagedObject 将 NSDictionary 保存到 CoreData?

使用 NSDictionary 内容创建 NSManagedObject

如何将其他 NSManagedObjects 存储为 NSManagedObject 的属性

NSManagedObject 和 Codable 用于存储在服务器和本地存储中的类

获取 NSManagedObject 的属性作为 NSDictionary

在插入之前分配 NSManagedObject 属性不会坚持