【发布时间】:2019-12-10 17:00:29
【问题描述】:
我需要在不丢失父/所有者的情况下执行迁移。如何在迁移块中执行此操作?
迁移前
class Deck : Object {
@objc dynamic var name : String = ""
var cards = List<Card>()
}
class Card : Object {
@objc dynamic var text = ""
var parentCategory = LinkingObjects(fromType: Deck.self, property: "cards")
}
迁移后
class Deck : Object {
@objc dynamic var name : String = ""
let cards = LinkingObjects(fromType: Card.self, property: "owner")
}
class Card : Object {
@objc dynamic var text = ""
@objc dynamic var owner : Deck?
}
在新版本的应用程序中,当我制作新卡时,我会这样设置父级:
let decks = realm.objects(Deck.self)
owner = decks[index]
我只需要这样做,但在迁移的背景下:
let realm = try! Realm()
let decks : Results<Deck>? = realm.objects(Deck.self)
do {
try realm.write {
if decks!.count > 0 {
for indexOfDeck in 0...decks!.count - 1 {
if decks![indexOfDeck].cards.count > 0 {
for indexOfCard in 0...decks![indexOfDeck].cards.count - 1 {
decks![indexOfDeck].cards[indexOfCard].owner = decks![indexOfDeck]
}
}
}
}
}
}catch{
}
【问题讨论】:
-
有几种方法可以做到这一点,但这是一个问题。一个牌组通常有一组独特的牌,牌组是父母/所有者,牌组属于该牌组。所以 List 代表多对关系,而 LinkingObjects 代表反向关系。这反映在您的第一个模型中。在您的第二个模型中,您将失去自动关系生成功能,因此如果将卡片添加到套牌中,则不会设置其所有者。这真的是你想要的吗?
-
第二个问题:第一个模型中的 Card 类具有 LinkingObjects,这意味着一张卡可以链接回多个 Decks。是这样吗?
-
您对我的第一个或第二个问题的回答是“是”吗?
-
对于两者:)))))
-
我只需要制作:let decks = realm.objects(Deck.self) owner = decks[index] 为了不失去父母。它会按我的预期工作。我已经检查过了。我用于此目的(用于 0..decks.count 中的索引)。
标签: ios swift migration realm realm-migration