我正在使用Realm通知块来更新页面中的消息。
let messageResult = realm.Object(MessageRealm.self)
notificationTokenMessage = messageResult.addNotificationBlock{ [weak self] (changes: RealmCollectionChange) in {
switch changes {
case .initial(_),
.update(_, _, _, _):
self?.tableView.reloadData()
default:
break
}
}
}
在MessageRealm类中,有一个属性,名称作者。作者基本上是UserRealm对象。
Class MessageRealm extends Object {
dynamic var _id: String? = nil
dynamic var body: String? = nil
dynamic var author: UserRealm? = nil
override class func primaryKey() -> String? { return "_id" }
}
Class UserRealm extends Object {
dynamic var _id: String? = nil
dynamic var fullName: String? = nil
dynamic var status: String? = nil // 'online' or 'offline'
override class func primaryKey() -> String? { return "_id" }
}
当从套接字收到新消息时,消息页面会在从Realm收到通知时更新。但是,当从套接字收到用户更新通知时,领域会更新消息页面。我不想更新邮件页面以获取作者对象中的更新。
可能的解决方案:
Class MessageRealm extends Object {
dynamic var _id: String? = nil
dynamic var body: String? = nil
dynamic var author: UserRealm? = LinkingObjects(fromType: UserRealm.self, property: "messages")
override class func primaryKey() -> String? { return "_id" }
}
Class UserRealm extends Object {
dynamic var _id: String? = nil
dynamic var fullName: String? = nil
dynamic var status: String? = nil // 'online' or 'offline'
let messages = List<MessageRealm>()
override class func primaryKey() -> String? { return "_id" }
}
我们可以使用LinkingObjects解决它。但是,这种反向关系需要与地图直接相关。我对吗?因此,需要在用户中具有消息列表的属性。从MessageRealm我必须链接到用户。但这将很难维持。
将作者的ID在MessageRealm中存储为外键,如传统数据库。
你有什么建议?
我们如何在Realm中进行规范化以避免更新问题?
管理更大的数据库是否有任何约定或最佳做法? (我知道蒂姆的回答https://stackoverflow.com/a/31594548/2666902)
答案 0 :(得分:0)
在我看来,最好的解决方案是将author
属性保持为从MessageRealm
到UserRealm
的一对一关系,因为单个邮件只能有一个作者并在UserRealm
中创建反向关系。
class MessageRealm: Object {
dynamic var _id: String? = nil
dynamic var body: String? = nil
dynamic var author: UserRealm? = nil
override class func primaryKey() -> String? { return "_id" }
}
class UserRealm: Object {
dynamic var _id: String? = nil
dynamic var fullName: String? = nil
let messages = LinkingObjects(fromType: MessageRealm.self, property: "author")
override class func primaryKey() -> String? { return "_id" }
}
这样,您只需要更新邮件的author
属性,messages
UserRealm
属性就会自动保持同步,因此每次尝试访问时都会如此,您将看到所有MessageRealm
个对象,其中作者等于特定用户。