如何在iOS Swift中用RealmSwift创建类Firebase结构的模型?
解决Realm模型中数组与字典的持久化问题(对齐Firebase结构)
首先得明确:Realm不支持直接存储原生的Swift数组([String])和字典([String:String]),得用Realm提供的专用类型来实现对应的结构,才能和Firebase的数组/字典结构对齐。下面是具体的修改方案:
1. 修正模型代码
处理数组to:改用Realm的List<String>
Realm支持基本类型的List集合(比如List<String>、List<Int>),直接替换原生数组就能实现和Firebase数组一致的存储结构。
处理字典groupMemberss:用键值对对象模拟字典
Realm没有原生字典类型,我们可以创建一个EmbeddedObject(轻量型对象,无需独立主键)来存储键值对,再用List管理这些键值对,以此模拟Firebase的字典结构。
修改后的Realm模型代码:
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? // 用List存储键值对对象,模拟Firebase字典结构 let groupMemberss = List<KeyValuePair>() let groupMemebersCount = RealmOptional<Int>() @objc dynamic var task: Bool = false // 改用Realm的List<String>替换原生数组 let to = List<String>() } class timeStampValue: Object { let timestamp = RealmOptional<Int>() } // 用于模拟字典的键值对对象,EmbeddedObject更适合这种附属型数据 class KeyValuePair: EmbeddedObject { @objc dynamic var key: String = "" @objc dynamic var value: String = "" }
2. 修正控制器中的数据赋值代码
现在需要把原来的字典和数组转换成Realm支持的类型:
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.chatCreatedDateTimee.append(timevalue) // 别忘了把时间对象加入List myMessage.chatId = "+918000080000" myMessage.from = "+918000080000" // 把原生字典转换成KeyValuePair对象,加入groupMemberss for (key, value) in oneVal { let pair = KeyValuePair() pair.key = key pair.value = value myMessage.groupMemberss.append(pair) } // 把原生数组的元素批量加入Realm的List<String> myMessage.to.append(objectsIn: cont) try! realm.write { realm.add(myMessage) } }
3. 结构对齐说明与查询技巧
- 对于数组
to:Realm的List<String>在存储逻辑上和Firebase的字符串数组完全对应,读取时直接遍历List就能得到和Firebase数组一致的内容。 - 对于字典
groupMemberss:用List<KeyValuePair>模拟的键值对集合,逻辑上等价于Firebase的字典结构。如果需要像字典一样通过key快速查找value,可以用Realm的查询实现:// 查找key为"909090"对应的value let targetPair = myMessage.groupMemberss.first { $0.key == "909090" } let targetValue = targetPair?.value
如果你的Firebase字典是嵌套的复杂类型,只需要扩展KeyValuePair或者创建对应的嵌套EmbeddedObject即可适配。
内容的提问来源于stack exchange,提问作者PvDev
相关产品推荐
相关产品推荐

