我試圖將一個屬性為List<String>的物件遷移到List<ChildObject>,其中ChildObject是一個自定義的EmbeddedObject。
舉例說明
。我的意思是:
import RealmSwift
final class ParentObject: Object {
//以前,這個屬性的型別是`List<String>`。
@Persisted public var children: List<ChildObject>
}
final class ChildObject: EmbeddedObject {
@Persisted var name = ""
我使用這段代碼進行遷移,產生了錯誤:
我使用這段代碼進行遷移,產生了錯誤。
不能直接創建嵌入式物件
let configuration = Realm. Configuration(schemaVersion: 1) { migration, oldSchemaVersion in if oldSchemaVersion </span> 1 { migration.enumerateObjects(ofType: ParentObject.className()) { oldObject, newObject in. let childrenStrings = oldObject! ["children"] as! List<DynamicObject> let childrenObjects = newObject! ["children"] as! List<MigrationObject> // I'm trying to retain the previous values for `children` (of type `String`) . //其中每個值被用作新的`ChildObject'的`name'屬性。 for string in childrenStrings { childrenObjects.append( //這一行產生錯誤:() migration.create(ChildObject.className(), value: [string]) ) } } } } let realm = try! Realm(configuration: 配置)問題
我如何在保留之前的值的情況下進行遷移?uj5u.com熱心網友回復:
最簡單的做法是用每個子物件的所有屬性名/值對創建一個
Dictionary,然后用這些屬性對的陣列創建新的List的全部內容。但是首先您需要從舊的
List的children中提取String值。之所以需要這樣做,是因為Realm并沒有將List<String>的元素表示為一個實際的String(這是一個結構)。我們可以從description欄位中提取實際值:childrenStrings .map { String(describing: $0) }一旦你有了名字,你就可以用一個
Dictionary來表示這個新的ChildObject。注意,你必須在Dictionary中包含所有的屬性名稱和值。因為我們只有一個,叫做 "name",所以我們包括:childrenStrings .map { String(describing: $0) } .map { ["name": $0] 。}你的錯誤資訊說:
不能直接創建嵌入式物件
然而,你可以使用
Array的Dictionary來創建你的新物件,其中Array對應于List,每個Dictionary對應于一個ChildObject物件。把它放在一起,我們就有了:
migration.enumerateObjects(ofType: ParentObject.className() { oldObject, newObject in. let childrenStrings = oldObject! ["children"] as! List<DynamicObject> newObject?.setValue( Array( 兒時的字串 .map { String(描述:$0) } .map { ["name": $0] 。} ), forKey: "children") ) }轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/307282.html
標籤:
上一篇: <asideclass="s-notices-notice__infojs-post-noticemb16"role="status">。
