我有一个复杂的对象需要存储在 CoreData 中。该对象具有本身就是对象的字段等。这是主要对象:
struct MyObject: Codable {
let opportunityID: HOV_String
let displayName: HOV_String
let displayUnit: HOV_String
let opportunityPoints: HOV_Float
let date_SatisfyingEvent: HOV_Date
let opportunityAchieved: HOV_Bool
let opportunityMissed: HOV_Bool
let didUserActivate: HOV_Bool
let didUserDismiss: HOV_Bool
let evaluationType: HOV_String
let deleteOnReconfigure: HOV_Bool
let dataType: HOV_String
let dataTypeType: HOV_String
let tolerance: HOV_Float
let availableTapDest: HOV_String
let availableTapDestType: HOV_String
let achievedTapDest: HOV_String
let achievedTapDestType: HOV_String
let missedTapDest: HOV_String
let missedTapDestType: HOV_String
let isBlurable: HOV_Bool
let userid: String
let date_Saved: Date?
var date_Acknowledgement: Date?
var acknowledgementStatus: Int
let hkid: String
var buildNo: Int
var releaseVersion: String
var timeZone: String
let date_Created: Date?
...
//Some Initializers...
}
您会注意到自定义类型,每个类型都以“HOV_”为前缀。这些变量的组成都是相同的,作为一个具有相应类型的可选版本和另一个 UpdateMetaData 字段的结构。例如,HOV_Bool 类型如下所示:
struct HOV_Bool: Codable {
var value: Bool?
let updateData: UpdateMetaData
init(val: Bool? = nil, time: Date? = Date()) {
value = val
updateData = UpdateMetaData(time: time)
}
}
UpdateMetaData也是一个带有多个参数的结构,如下所示:
struct UpdateMetaData: Codable {
var lastUpdated: Date?
var enforceUpdate: Bool?
var freezeValue: Bool?
init(time: Date? = Date()) {
lastUpdated = time
enforceUpdate = false
freezeValue = false
}
}
您会注意到每个结构和子结构都符合 Codable 协议。这是因为这个结构也在我的服务器和客户端之间来回传递,这使得它可以很容易地转换成一个 JSON 对象。 但是,我不想简单地序列化 MyObject 并将其作为 Data 对象存储到 CoreData 或其他地方,因为这会使它无法通过其参数进行查询。至少,我需要 MyObject 可以通过 date_Created 参数在 CoreData 中查询。
我认为一个潜在的解决方案是将 MyObject 转换为自身的一个版本,其中所有非本地类型(所有“HOV_”类型参数)都转换为数据(这留下了一些重要的元数据字段,如date_Created 字段原样)并简单地拥有一个看起来与上面的 MyObject 描述完全一样的 CoreData 实体,其中这些字段被标记为 Transformable。然后,当我从 CoreData 读取时,只需将序列化信息打包回 MyObject 结构。
即使这是最好的解决方案,我仍然对如何实施这个问题有点模糊,并且非常希望对这方面的一些解释。如果对于这种情况有更好的方法甚至行业标准,请告诉我。
在寻找这个问题的答案时,我遇到了一些我认为可能相关的问题,所以我将它们链接在这里:
这个问题大致是我的问题的一个更基本的版本。一个答案提到创建其他实体,然后在它们之间创建一对多关系。我不认为我想要这种方法,因为它更适合复杂子结构的数组,而且我最终基本上会为我用“HOV_”定义的每个字段创建一个新实体。这里的第二个答案提到序列化整个对象(我不能这样做),但这让我想到了我提出的潜在解决方案。