【问题标题】:How do I query Realm database based on current user ID?如何根据当前用户 ID 查询 Realm 数据库?
【发布时间】:2015-12-21 13:27:07
【问题描述】:

我有一个 Realm 数据库,它保存具有不同用户 ID 的不同用户的记录。

我还有一个 UITableViewController 可以显示 Realm 查询的结果。我希望查询只返回当前用户的段落。

class PassageListController: UITableViewController {

  var currentUserID: Int = NSUserDefaults.standardUserDefaults().objectForKey("currentUserID") as! Int
  lazy var dataArray: Results<Passage> = { return try! Realm().objects(Passage).filter("userID == \(currentUserID)")}

问题是我收到以下错误消息:

实例成员“currentUserID”不能用于类型“PassageListController”

尽管尝试延迟加载 Realm 查询。解决这个问题的最佳实践方法是什么?

期待一些解决方案:

  1. 我无法在 viewDidAppear() 中加载查询,因为无法定义空的 Realm Result 并且它需要在整个控制器中都可以访问。
  2. 我可以将 currentUserID 设置为全局变量,但这违反了我的原则。

【问题讨论】:

    标签: swift2 realm


    【解决方案1】:

    在到达 Realm 查询之前,它似乎在计算 currentUserID 的计算值时遇到了一些问题。

    Looking around on SO,看来这种问题可以通过将currentUserID的定义更改为只读访问器来解决:

    var currentUserId: Int {
       get {
          return NSUserDefaults.standardUserDefaults().objectForKey("currentUserID") as! Int
       }
    }
    

    希望对你有所帮助!

    【讨论】:

      【解决方案2】:

      TiM 的回答让我找到了正确的方法:

        class PassageListController: UITableViewController {
      
          var currentUserID: Int = NSUserDefaults.standardUserDefaults().objectForKey("currentUserID") as! Int
      
          var dataArray: Results<Passage> {
            get {
              return try! Realm().objects(Passage).filter("userID == \(currentUserID)")
            }
          }
      

      项目现在构建,但我不确定这是否是使用 Realm 的最佳方法,因为

      • 现在查询可能会在每次访问 dataArray 时运行,并且
      • 我不确定 Realm 的通知是否会起作用。

      【讨论】:

      • 很高兴能帮上忙!嗯,是的。如果您将该数组插入表格视图,这似乎是一种非常低效的方法。如果 viewDidAppear 为时已晚,我想知道是否值得在转换到此视图控制器之前执行此查询,并在实例化时简单地将结果传递给它。
      猜你喜欢
      • 2017-10-06
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多