首页 文章

使用迁移块内的旧模式实例化领域对象

提问于
浏览
0

我已经为一个领域对象添加了一个 calculation 属性,现在我不得不在迁移块中设置它的值,因为我无法实例化一个对象将它传递给计算器 .

这是我的模型:

import Foundation
import RealmSwift

class Loan: Object {

    dynamic var id: String = NSUUID().UUIDString
    dynamic var creationDate: NSDate = NSDate()
    dynamic var title: String = ""
    dynamic var amount: Double = 0.0
    dynamic var rate: Float = 0.0
    dynamic var term: Int = 0
    dynamic var type: Int = TYPE_ANNUITY
    dynamic var firstPaymentDate: NSDate = NSDate()
    dynamic var issueDate: NSDate?

    let extras = List<Extra>() // this is a list of nested realm models which is also used for calculation

    dynamic var calculation: CalculationResult? // !! added this property !!

    static let TYPE_ANNUITY = 0
    static let TYPE_GRADED = 1


    override class func primaryKey() -> String? {
        return LoanPropNames.Id
    }
}

struct LoanPropNames {
    static let CreationDate = "creationDate"
    static let Id = "id"
    static let Calculation = "calculation"
}

calculation 的值由带有签名的辅助方法计算,如下所示:

func calculate(loan: Loan) -> CalculationResult

以下是Realm的配置代码:

class RealmConfigurator {

    private static let schemaVersionAddedCalculationProp: UInt64 = 1

    private static let schemaVersionLatest = schemaVersionAddedCalculationProp

    static func createConfiguration() -> Realm.Configuration {

        return Realm.Configuration(
            schemaVersion: schemaVersionLatest,
            migrationBlock: {
                migration, oldSchemaVersion in

                if oldSchemaVersion < schemaVersionAddedCalculationProp {

                    migration.enumerate(Loan.className()) {
                        oldObject, newObject in

                        if let oldObject = oldObject,
                            let newObject = newObject {

                            // this is how I try to instantiate a loan to pass it to the CalculationHelper
                            let loan = Loan(value: oldObject, schema: migration.oldSchema)

                            newObject[LoanPropNames.Calculation] = CalculationHelper.calculate(loan)
                        }    
                    }
                }
            }
        )
    }
}

问题就在于此

let loan = Loan(value: oldObject, schema: migration.oldSchema)

编译说

无法将'Schema'类型的值转换为预期的参数类型'RLMSchema'

如果我尝试像这样运行:let loan = Loan(value:oldObject)

我得到运行时错误:

由于未捕获的异常“RLMException”而终止应用程序,原因是:“类贷款的属性名称计算无效 . ”

Question :如何在迁移期间实例化Loan对象以填充 calculation 属性?

我不想让它成为 lazy ,因为当其他属性发生变化时需要重新计算 . 使它成为计算属性也不是一个好的解决方案,因为每次访问需要一段时间来计算值 .

1 回答

  • 1

    我认为您可以使用KVC来填充贷款对象的属性 . 如下:

    // 1. Create empty loan object
    let loan = Loan()
    
    // 2. Fill loan object's properties with old object
    let propertyNames = oldObject.objectSchema.properties.map { $0.name }
    let values = oldObject.dictionaryWithValuesForKeys(propertyNames)
    loan.setValuesForKeysWithDictionary(values)
    
    // 3. Create standalone calcuration object
    let calculation = CalculationHelper.calculate(loan)
    
    // 4. Save calculation object and assign
    newObject[LoanPropNames.Calculation] = migration.create(CalculationResult.className(), value: calculation)
    

相关问题