RealmSwift:如何将多个对象添加到多对一关系?

时间:2019-01-29 16:13:18

标签: swift database realm realm-database

我的目标是迅速发展这种关系:relationship between two data sets in realm for swift

我有一个包含所有个字符的数据集。然后,我有几个列表,我要向其中添加某些字符。

这是我到目前为止用快速代码得到的:

//
//  Lists.swift
//
//  Created by Guest on 28.01.19.
//  Copyright © 2019 Dom. All rights reserved.
//
// https://academy.realm.io/posts/realm-primary-keys-tutorial/

import Foundation
import RealmSwift

class Lists: Object {
    // making use of primary keys
    @objc dynamic var listID = UUID().uuidString
    @objc dynamic var listName : String = ""
    @objc dynamic var listDesc : String = ""
    @objc dynamic var listProgressPercentage : Int = 0
    // lists all characters associated with this list
    var charIDs = List<Characters>()

    override static func primaryKey() -> String? {
        return "listID"
    }
}

并且:

//
//  Characters.swift
//
//  Created by Guest on 28.01.19.
//  Copyright © 2019 Dom. All rights reserved.
//

import Foundation
import RealmSwift

class Characters: Object {
    // get charID from dictionary.txt later
    @objc dynamic var charID        = 0
    @objc dynamic var character     : String = ""

}

我的问题: -列表仍然为空。现在如何添加新列表 ,并添加例如25个对“字符”中的对象的不同对象引用?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我没有看到代码有什么问题。这是我所做的测试。我创建了两个列表和两个字符,然后将第一个字符添加到第一个列表,将第二个字符添加到第二个列表。

    let l0 = Lists()
    l0.listName = "list 0"

    let l1 = Lists()
    l1.listName = "list 1"

    let c0 = Characters()
    c0.character = "char 0 list 0"
    c0.charID = 0

    let c1 = Characters()
    c1.character = "char 1 list 1"
    c1.charID = 1

    l0.charIDs.append(c0)
    l1.charIDs.append(c1)

然后将数据写入Realm

do {
    let realm = try Realm()

    try! realm.write {
        realm.add(l0)
        realm.add(l1) 
    }
} catch let error as NSError {
    print(error.localizedDescription)
}

,然后使用Realm Studio检查领域,字符和列表均已正确写入,并且列表CharIDs属性链接回该字符。

可能引起问题的不是代码,而是对象的命名方式。例如,列表对象不是列表。它是一个单个对象,其中包含类型列表的属性以及描述该特定列表的其他属性。同样,Characters对象也不是一堆字符,它是具有描述该字符属性的单个字符。

假设这些对象是用于冒险类游戏的,我们希望跟踪哪些角色访问了游戏中的某个区域。

第一个对象用于游戏中的特定区域,该区域描述了该区域并包含访问过的角色的列表属性。

class AreaVisitedObject: Object {
   @obj dynamic var: area_name = ""
   @obj dynamic var: area_id = ""
   var charsWhoVisitedList = List<Character>()
   @objc dynamic var char_id = UUID().uuidString

   override static func primaryKey() -> String? {
      return "area_id"
   }
    ...

然后是描述每个字符的字符对象

class CharacterObject: Object {
   @objc dynamic var char_name = ""
   @objc dynamic var char_id = UUID().uuidString

   override static func primaryKey() -> String? {
      return "char_id"
   }
    ...

请注意,我向角色添加了一个主键对象,因为您似乎不会有重复的字符,因此它将确保每个字符都是唯一的,并且可以被该uuid引用。

希望有帮助。