如何在 iOS swift 中使用 RealmSwift 创建类似 firebase 结构的模型?

How to create model like firebase structure using RealmSwift in iOS swift?

我一直在尝试创建类似于 firebase 数据库结构的模型。我可以创建普通的字符串、bool 和 int 值,但不能创建数组和字典。

这是我的 firebase 结构截图:

我在这里尝试在类似 firebase 结构的模型中添加 groupMembersto

这是我尝试使用数组和字典创建的模型:

import Foundation
import RealmSwift

class RealmMessages: Object {

@objc dynamic var messageText : String?
@objc dynamic var sender: String?
let chatCreatedDateTimee = List<timeStampValue>()
@objc dynamic var chatId: String?
@objc dynamic var from: String?
@objc dynamic var groupMemberss : [String: String]!
let groupMemebersCount = RealmOptional<Int>()
@objc dynamic var task: Bool = false
@objc dynamic var to: Array = [String]()


}

class timeStampValue: Object {

  let timestamp = RealmOptional<Int>()

}

这是我的控制器代码:尝试将值添加到领域数据库中。

var dic : [String : String] = [:]
var cont = ["one", "two", "three"]

var oneVal = ["909090": "SELF", "808080": "Other"]

 override func viewDidLoad() {
    super.viewDidLoad()



    let realm = try! Realm()

    print("realm location:::\(String(describing: Realm.Configuration.defaultConfiguration.fileURL))")


    let myMessage = RealmMessages()

    myMessage.messageText = "Diva"
    myMessage.sender = "yIvq1mQxjfZpjs1ybRTTlDOmUKV2"

    let timevalue = timeStampValue()
    timevalue.timestamp.value = 123123131

    myMessage.chatId = "+918000080000"
    myMessage.from = "+918000080000"

    myMessage.groupMemberss = oneVal
    myMessage.to = cont

    try! realm.write {

        realm.add(myMessage)
    }

 }

如何在像 firebase 这样的领域数据库中获取 groupMemberssto 结构。以及如何在领域中创建数组和字典

有很多解决方案,但这里有两个。

假设数据已被读入,并且 groupMembers 快照中的数据位于如下所示的字典 var 中

let groupMembersDict = [
    "919": "participant",
    "111": "observer",
    "222": "participant"
]

要将其存储在 Realm 中,您可以使用原语并将每个键和值存储在单独的列表中(想想:数组),或者您可以利用托管的 Realm 对象并将它们存储在列表中。

如果你想将数据保存在一个对象中;这就是它的样子。

class GroupData: Object {
    @objc dynamic var num = ""
    @objc dynamic var type = ""

    convenience init(withNum: String, andType: String) {
        self.init()
        self.num = withNum
        self.type = andType
    }
}

这是显示两个选项的主要对象;选项 1:将键值对存储在两个数组中,或选项 2:使用上述 GroupData 对象将键值对存储在一起

class Messages: Object {
    @objc dynamic var messageText = ""

    //option 1: two lists of primative strings that can be accessed like an array.
    // downside is managing two lists
    let groupNum = List<String>()
    let groupType = List<String>()

    //option 2: a list of members using another Realm object
    let groupNumType = List<GroupData>()
}

以及创建两条消息的一些代码,每种消息一条

let msg0 = Messages()
msg0.messageText = "My message"
for member in groupMembersDict {
    msg0.groupNum.append( member.key )
    msg0.groupType.append( member.value )
}

let msg1 = Messages()
msg1.messageText = "This message"
for member in groupMembersDict {
    let aGroup = GroupData(withNum: member.key, andType: member.value)
    msg1.groupNumType.append(aGroup)
}

将它们存储在领域

realm.add(msg0)
realm.add(msg1)

在显示来自选项 2 的消息中读取它们。选项 1 只是遍历数组以打印组数据

let messageResults = realm.objects(Messages.self)

for msg in messageResults {
    print(msg.messageText)
    for group in msg.groupNumType {
        print(group.num, group.type)
    }
}

请记住,所有托管属性都必须是原语:NSString、NSDate、NSData、NSNumber 或 List、Results、RLMLinkingObjects 或 RLMObject 的子类,如上面所示的 GroupData。