gpt4 book ai didi

swift - 将数据存储在核心数据中的自定义类数组中

转载 作者:行者123 更新时间:2023-11-30 10:49:43 24 4
gpt4 key购买 nike

我有一个实体,其中有一些属性,我已将自定义类传递给这些属性,这些属性将数据存储在该类的数组中我的核心数据实体如下所示,

enter image description here

我的 NSManangedObject 类看起来像这样,

extension SingleChat {

@nonobjc public class func fetchRequest() -> NSFetchRequest<SingleChat> {
return NSFetchRequest<SingleChat>(entityName: "SingleChat")
}

@NSManaged public var name: String?
@NSManaged public var roomSID: String?
@NSManaged public var isGroup: Bool
@NSManaged public var lastMessage: String?
@NSManaged public var lastMsgTime: String?
@NSManaged public var lastMsgTimeActual: String?
@NSManaged public var profilePic: String?
@NSManaged public var lastMsgRead: Bool
@NSManaged public var unReadMsgsCount: Int16
@NSManaged public var actualNameFor_1_2_1_chat: String?
@NSManaged public var isNewGroup: Bool
@NSManaged public var members : [TCHMember]
@NSManaged public var messages : [TCHMessage]
@NSManaged public var twChannelObj: TCHChannel?
@NSManaged public var groupInfo : [String:JSON]?
}

这就是我在核心数据中保存数据的方式,

 let appDelegate = UIApplication.shared.delegate as? AppDelegate
let context = appDelegate?.persistentContainer.viewContext
let entity = NSEntityDescription.entity(forEntityName: "SingleChat", in: context!)
let user = NSManagedObject(entity: entity!, insertInto: context)

for items in dateWiseSortedSingleRooms
{
user.setValue(items.name, forKey: "name")
user.setValue(items.actualNameFor_1_2_1_chat, forKey: "actualNameFor_1_2_1_chat")
user.setValue(items.isGroup, forKey: "isGroup")
user.setValue(items.lastMsgRead, forKey: "lastMsgRead")
user.setValue(items.lastMsgTimeActual, forKey: "lastMsgTimeActual")
user.setValue(items.lastMessage, forKey: "lastMessage")
user.setValue(items.lastMsgTime, forKey: "lastMsgTime")
user.setValue(items.profilePic, forKey: "profilePic")
user.setValue(items.roomSID, forKey: "roomSID")
user.setValue(items.isNewGroup, forKey: "isNewGroup")
user.setValue(items.unReadMsgsCount, forKey: "unReadMsgsCount")
user.setValue(items.unReadMsgsCount, forKey: "unReadMsgsCount")
user.setValue(items.members, forKey: "members")
user.setValue(items.messages, forKey: "messages")
user.setValue(items.twChannelObj, forKey: "twChannelObj")
}

do {
try context?.save()
print("Saved successfully.")
} catch {
print("Fail to save")
}

现在,当我的代码执行应用程序在这一行崩溃时,

user.setValue(items.members, forKey: "members")
user.setValue(items.messages, forKey: "messages")

出现错误,

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[TCHMember encodeWithCoder:]: unrecognized selector sent to instance 0x2807a1780

我该如何解决这个问题?并将我的自定义类数组数据存储在其中?

最佳答案

如果你想在核心数据中存储非标准对象,相应的属性是transformable类型,这样它就可以与NSData相互转换。< br/>如果对象采用NSCoding protocol,则可以完成此操作,这需要实现函数 encode(with:)init(coder:) (此处描述)。这些函数定义必须存储和恢复自定义对象的哪些属性。
有关如何使用这些函数的示例,请参见 here .

编辑:

还有另一种处理可转换属性的方法:您可以实现自定义的 NSValueTransformer,而不是采用 NSCoding 协议(protocol)。该类可以独立于您的第 3 方类来实现,see here ,并在您的核心数据模型中指定 see here 。可以找到一个示例 here

编辑2:

我自己没有使用第二种方法,但我的印象是:
为了将自定义对象存储在核心数据中,必须将其转换为 NSData,并且在获取期间,NSData 必须转换回您的对象。

一种方法是使用 NSCoding,但这需要在自定义类中实现它,也许作为扩展。如果这是不可能的,就像您的情况一样,您可以实现自定义 NSValueTransformer 对象。

对于编码,它将提供一个自定义对象作为输入,并根据相关属性创建适当的 NSData 对象。对于解码,它接受一个 NSData 对象,初始化自定义对象的新实例,并设置这些属性。

您只需在核心数据模型中指定 NSValueTransformer 的名称,核心数据将使用此自定义 NSValueTransformer。您可以找到example here .

关于swift - 将数据存储在核心数据中的自定义类数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54883729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com