首页 > 解决方案 > 领域迁移中的转换错误以将属性 Double 更改为 List

问题描述

我需要的是根据以下代码创建要更改discount:Double为的迁移。discounts:List<Discount>()

这是现有对象:这就是我Realm Object现在的样子。

class Item:Object{
    @objc dynamic var itemName:String = "Some Name"
    @objc dynamic var discount:Double = 0 // need to change this property
}

这是我试图做出改变的方式。

新对象:

class Discount: Object {
    @objc dynamic var name:String = "Discount Name"
    @objc dynamic var discount:Double = 0.0
}

one-to-many具有关系的修改对象。

class Item:Object{
    @objc dynamic var itemName:String = "Some Name"
    let discounts = List<Discount>()
}

移民

    Realm.Configuration.defaultConfiguration = Realm.Configuration(
        schemaVersion: 3,
        migrationBlock: { migration, oldSchemaVersion in
            if (oldSchemaVersion < 3) {
                migration.enumerateObjects(ofType: Item.className()) { oldObject, newObject in

                    let oldDiscount = oldObject!["discount"] as! Double

                    let discount = Discount()
                    discount.amount = oldDiscount

                    let discounts = newObject!["discounts"] as! List<Discount>
                    discounts.append(discount)
            }
        }
    })

我收到错误:

无法将类型的值RealmSwift.List<RealmSwift.DynamicObject>(0x1c8910068)转换为RealmSwift.List<AppName.Discount> (0x1c890f6a0)

同样,问题是,如何创建要更改discount:Double为的迁移discounts:List<Discount>()

标签: iosswiftrealmdatabase-migrationrealm-migration

解决方案


您可以像 [oldDiscount] 这样的 List 将折扣属性迁移到新的折扣列表中

这是代码。我重命名了一些对象以使其更加清晰,因为重新使用“折扣”一词来指代类和属性令人困惑。

let vers = UInt64(1)
let config = Realm.Configuration( schemaVersion: vers, migrationBlock: { migration, oldSchemaVersion in
     if (oldSchemaVersion < vers) {
         print("performing migration")
         migration.enumerateObjects(ofType: ItemClass.className()) { oldItem, newItem in
            let oldDiscount = oldItem!["discount"] as? Double ?? 0.0

            let d = DiscountClass()
            d.name = "Test"
            d.discount = oldDiscount

            newItem!["discountList"] = [d]
         }
     } else {
        print("no migration needed")
    }
 })

推荐阅读