Realm Objective-C 到 Swift 的迁移(动态迁移)[复制]

Realm Objective-C to Swift Migration (Dynamic Migration) [duplicate]

提问人:Vishnu 提问时间:10/4/2023 最后编辑:Vishnu 更新时间:10/6/2023 访问量:125

问:

在本地数据库中,我们从 Realm (Obj-C) 迁移到了 RealmSwift。迁移后,我们在本地数据库中遇到了一个问题,就像所有属性在 Obj-C 中都声明为可选一样。然而,我们在 swift db 中使用了非可选。现在,我们被迫将整个数据库迁移到新数据库。

我们无法手动迁移每个属性。 喜欢

migrationBlock: { migration, oldSchemaVersion in
                if (oldSchemaVersion < 1) {
                    migration.enumerateObjects(ofType: User.className()) { oldObject, newObject in
                        newObject!["Id"] = oldObject!["Id"]
                    }
                }

我们需要一个函数来对每个属性进行迁移,而无需硬编码。根据需要动态处理相应的数据类型。

我们正在努力使动态函数。

swift objective-c 领域迁移

评论

1赞 Jay 10/6/2023
请不要发布重复的问题。最好使用其他信息或编辑来更新现有问题,并发布问题的答案(如果有)。

答:

-1赞 Vishnu 10/4/2023 #1

下面是领域迁移的动态函数,

        migrationBlock: { migration, oldSchemaVersion in
            if oldSchemaVersion < 1 {
                
                for objectSchema in migration.oldSchema.objectSchema {
                    
                    for property in objectSchema.properties {
                        
                        if property.isOptional {
                            migration.enumerateObjects(ofType: objectSchema.className) { oldObject, newObject in
                                if let oldValue = oldObject?[property.name] as? String {
                                    newObject![property.name] = String(oldValue)
                                }
                                
                                if let oldValue = oldObject?[property.name] as? Int {
                                    newObject![property.name] = Int(oldValue)
                                }
                                
                                if let oldValue = oldObject?[property.name] as? Bool {
                                    newObject![property.name] = Bool(oldValue)
                                }
                            }
                        }
                    }
                }
            }
        }

评论

0赞 Joakim Danielson 10/4/2023
如何迁移 nil 值?
0赞 Vishnu 10/5/2023
Nil 值将保持 nil 或 null。@Joakim丹尼尔森
0赞 Joakim Danielson 10/5/2023
但是你说新数据库将只包含非可选属性,所以很难理解这段代码背后的逻辑。
0赞 Vishnu 10/5/2023
是的,它是。我们正在将每个属性迁移到非可选属性。使用上述功能。
0赞 Jay 10/6/2023
我相信你错过了@JoakimDanielson提出的问题的重点。当前属性是可选的,可以是 nil。如何将 nil(可选)属性迁移到非可选属性。例如,非可选属性不能为 nil,它们必须包含一个值。因此,nil 值不能保持 nil,因为它会崩溃。