gpt4 book ai didi

swift - 了解 Realm 中的迁移 - Swift

转载 作者:搜寻专家 更新时间:2023-10-31 22:01:32 24 4
gpt4 key购买 nike

我正在尝试了解迁移,有人可以描述需要迁移的情况吗?

例如,让我们假设一个应用程序已经发布并使用了以下 Realm 对象,但现在需要发布版本 2 和一个新的 Realm 对象被添加到这个新版本,我需要迁移吗?

版本 1

import Foundation
import RealmSwift

class Item:Object{
dynamic var productName:String = ""
dynamic var createdAt = NSDate()
}


import Foundation
import RealmSwift

class ItemList: Object {
dynamic var listName = ""
dynamic var createdAt = NSDate()
let items = List<Item>()
}

版本 2

版本 2 需要一个新对象。

import Foundation
import RealmSwift

class Item:Object{
dynamic var productName:String = ""
dynamic var createdAt = NSDate()
}


import Foundation
import RealmSwift

class ItemList: Object {
dynamic var listName = ""
dynamic var createdAt = NSDate()
let items = List<Item>()
}

// New object for version 2
import Foundation
import RealmSwift

class NewObjec:Object{
dynamic var someString:String = ""
dynamic var createdAt = NSDate()
}

如果现有对象未更改但添加了额外的对象,我是否需要创建迁移?

总的来说,有人可以描述一下需要迁移的情况吗?

非常感谢

最佳答案

不,您应该更新架构版本,因为 Realm 架构已更新,但您不必添加迁移 block 。您可以将 Realm 视为一个真正的数据库,所以在这种情况下,它就像您添加一个新的“列”。

this Realm 文档部分,您可以找到以下 block :

// Set the block which will be called automatically when opening a Realm with
// a schema version lower than the one set above
migrationBlock: { migration, oldSchemaVersion in
// We haven’t migrated anything yet, so oldSchemaVersion == 0
if (oldSchemaVersion < 1) {
// Nothing to do!
// Realm will automatically detect new properties and removed properties
// And will update the schema on disk automatically
}
})

如果您只是添加/删除属性,您可以省略迁移 block ,更新 Realm 版本:

Realm.Configuration(schemaVersion: 2)

如您所见,他们说您必须更新模式版本,然后它会自动更新 Realm 模式以添加新的(或删除的)属性。

如果您要进行“特殊”更改,则必须用您的逻辑填充迁移 block 。看看这个:

版本 1:

class Person: Object {
dynamic var firstName = ""
dynamic var lastName = ""
dynamic var age = 0
}

版本 2:

class Person: Object {
dynamic var fullName = ""
dynamic var age = 0
}

在这种情况下,您不只是添加 fullName 并删除 firstName、lastName,而是将它们组合在一起,因此需要自定义逻辑。

migrationBlock: { migration, oldSchemaVersion in
if (oldSchemaVersion < 1) {
// The enumerateObjects(ofType:_:) method iterates
// over every Person object stored in the Realm file
migration.enumerateObjects(ofType: Person.className()) { oldObject, newObject in
// combine name fields into a single field
let firstName = oldObject!["firstName"] as! String
let lastName = oldObject!["lastName"] as! String
newObject!["fullName"] = "\(firstName) \(lastName)"
}
}
})

总而言之,每次更新模型时都需要更新架构版本,但如果您只是添加/删除属性,则不需要编写迁移 block 。

编辑:感谢Dávid Pásztor征求意见

关于swift - 了解 Realm 中的迁移 - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44399896/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com