gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:30:50 25 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

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

最佳答案

如果要在core data中存储非标准对象,对应的属性是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/54746922/

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