在 CoreData 中读取/写入复杂对象并保持查询能力?

问题描述 投票:0回答:0

问题描述

我有一个复杂的对象需要存储在 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_”定义的每个字段创建一个新实体。这里的第二个答案提到序列化整个对象(我不能这样做),但这让我想到了我提出的潜在解决方案。

swift sqlite core-data
© www.soinside.com 2019 - 2024. All rights reserved.