领域:多对一关系的嵌套更新问题

时间:2017-09-21 10:12:17

标签: ios realm

我正在使用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" }
}
  1. 我们可以使用LinkingObjects解决它。但是,这种反向关系需要与地图直接相关。我对吗?因此,需要在用户中具有消息列表的属性。从MessageRealm我必须链接到用户。但这将很难维持。

  2. 将作者的ID在MessageRealm中存储为外键,如传统数据库。

  3. 你有什么建议?

    我们如何在Realm中进行规范化以避免更新问题?

    管理更大的数据库是否有任何约定或最佳做法? (我知道蒂姆的回答https://stackoverflow.com/a/31594548/2666902

1 个答案:

答案 0 :(得分:0)

在我看来,最好的解决方案是将author属性保持为从MessageRealmUserRealm的一对一关系,因为单个邮件只能有一个作者并在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个对象,其中作者等于特定用户。