【问题标题】:How to create model like firebase structure using RealmSwift in iOS swift?如何在 iOS swift 中使用 RealmSwift 创建类似于 firebase 结构的模型?
【发布时间】:2019-07-19 09:13:07
【问题描述】:

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

这是我的firebase结构截图:

在这里,我尝试将 groupMembersto 添加到模型中,例如 firebase 结构。

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

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 结构。以及如何在领域中创建数组和字典

【问题讨论】:

    标签: ios arrays swift dictionary realm


    【解决方案1】:

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

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

    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。

    【讨论】:

    • 抱歉回复晚了..感谢您的回答。会尽快回复你的..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    相关资源
    最近更新 更多