如何在iOS Swift中使用RealmSwift创建类似于Firebase结构的模型?

时间:2019-07-19 09:13:07

标签: ios arrays swift dictionary realm

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

这是我的Firebase结构屏幕截图:

enter image description here

在这里,我正在尝试在模型(如Firebase结构)中添加 groupMembers

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

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)
    }

 }

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

1 个答案:

答案 0 :(得分:0)

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

假设已读取数据,并且来自groupMembers快照的数据位于看起来像这样的字典var中

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

要将其存储在Realm中,可以使用基元并将每个键和值存储在单独的List(认为是数组)中,也可以利用托管的Realm对象并将它们存储在List中。

如果要将数据保留在对象内;这是它的样子。

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的子类,如上面显示的G​​roupData。