iOS (Swift):核心数据可转换属性
iOS (Swift): Core data transformable attributes
我有一个简单的 Time
class 采用 NSCoding
协议:
class Time: NSObject, NSCoding {
var hours: Int
func encode(with aCoder: NSCoder) {
aCoder.encode(self.hours, forKey: "hours")
}
public required init?(coder aDecoder: NSCoder) {
guard let hours = aDecoder.decodeObject(forKey: "hours") as? Int
else { return nil }
self.hours = hours
}
init(hours: Int) {
self.hours = hours
}
}
我想成为我的 Watch
实体的 Transformable
属性:
final class Watch: NSManagedObject {
@NSManaged public fileprivate(set) var time: Time
}
如图所示:
我成功地将其保存到托管对象上下文中,但是当我重新加载应用程序时,time
属性为 nil
。
我是不是漏掉了什么?为什么这个属性没有成功保存?这似乎是其他帖子所需要的。
非常感谢您的帮助!
@IraniyaNaynesh 在问题评论中的建议是转移注意力。
答案其实很简单。将init?(coder aDecoder: NSCoder)
方法中的decodeObject
改为decodeInteger
,数据恢复为BLOBS
,即notnil
和已从 SQLite 数据库成功保存。
我有一个简单的 Time
class 采用 NSCoding
协议:
class Time: NSObject, NSCoding {
var hours: Int
func encode(with aCoder: NSCoder) {
aCoder.encode(self.hours, forKey: "hours")
}
public required init?(coder aDecoder: NSCoder) {
guard let hours = aDecoder.decodeObject(forKey: "hours") as? Int
else { return nil }
self.hours = hours
}
init(hours: Int) {
self.hours = hours
}
}
我想成为我的 Watch
实体的 Transformable
属性:
final class Watch: NSManagedObject {
@NSManaged public fileprivate(set) var time: Time
}
如图所示:
我成功地将其保存到托管对象上下文中,但是当我重新加载应用程序时,time
属性为 nil
。
我是不是漏掉了什么?为什么这个属性没有成功保存?这似乎是其他帖子所需要的。
非常感谢您的帮助!
@IraniyaNaynesh 在问题评论中的建议是转移注意力。
答案其实很简单。将init?(coder aDecoder: NSCoder)
方法中的decodeObject
改为decodeInteger
,数据恢复为BLOBS
,即notnil
和已从 SQLite 数据库成功保存。