ios - query.whereKey 对于关系返回 nil

标签 ios swift parse-platform

Xcode 7 beta 4

我有来自 Parse.comPoem 类。在我的 Parse User 类中,我有列 likedPoem ,它与类 Poem

相关

我的 Poem 类中只有一条记录。我之前将其添加到代码中的 likedPoem 中:

let query = PFQuery(className:"Poem")    
query.getObjectInBackgroundWithId(poemParseObjectId!) {

      (poem: PFObject?, error: NSError?) -> Void in

        if error == nil && poem != nil {

            let user = PFUser.currentUser()
            let relation = user!.relationForKey("likedPoem")
            relation.addObject(poem!)
            user!.saveInBackground()
        }
}

我可以在解析数据浏览器中看到它

现在我想检查当前用户是否喜欢我正在展示的这首诗:

let user = PFUser.currentUser()
let relation: PFRelation = user!.relationForKey("likedPoem")
let query = relation.query()!
query.whereKey("likedPoem", equalTo: poem!)
query.getFirstObjectInBackgroundWithBlock {
        (poem1: PFObject?, error: NSError?) -> Void in
              print(poem1)          
 }

它打印nil

如果我更改它以检查该列中的内容:

<...>
//query.whereKey("likedPoem", equalTo: poem!)
 query.getFirstObjectInBackgroundWithBlock {
     (poem1: PFObject?, error: NSError?) -> Void in
               print(poem1!)
               print(poem!)


}

我可以看到 poem1!not nil 并且它实际上具有与 poem! 相同的属性值

问题:为什么query.whereKey("likedPoem", equalTo:诗歌!)返回我nil

最佳答案

欢迎来到 stackoverflow!

我想我发现了您的代码的问题。 likedPoem 是解析表中的关系列。您使用 relationForKey 正确检索它,但检索它后,查询约束不正确。您不能对此列施加约束,因为该列是一个关系。认为它有一个 Poem 类的子集。您现在正在查询 Poem 类的子集,并且对查询施加的任何约束都必须与 Poem 类中的列相关。

因此,对于您想要执行的操作,请删除 query.whereKey("likedPoem", equalTo:诗歌!) 约束,并根据您正在显示的诗歌对象检查结果。

现在,这只有效,因为您有一个 Poem 对象,并且您正在调用 query.getFirstObjectInBackgroundWithBlock。将来(如果用户喜欢更多诗歌),您将不得不稍微修改一下并将其更改为 query.findObjectsInBackgroundWithBlock 以便您可以检索所有喜欢的诗歌的数组,然后您可以检查显示的诗是否在该数组中。

顺便说一句,我在很多应用程序中使用了解析,并且我了解到关系并不总是最好使用的东西,当您使用它们时,弄清楚将它们放在哪个类中可能会很棘手来优化您的查询。这就是为什么在确定应用程序的架构之前应始终牢记您的查询。您可以通过以下一些其他方法来完成您想做的事情:

  • 您可以对当前查询设置约束,例如 query.whereKey("objectId", equalTo:诗歌!.objectId)。这将检查关系中所有诗歌对象的 objectId,并将其与所显示诗歌的 objectId 进行比较。现在,您可以使用 countObjectsInBackgroundWithBlock 而不是检索对象。从技术上讲,您不需要检索所有诗歌(因为您已经拥有了想要的一首诗),您只是想知道它是否在关系中,因此 count 可以完美地做到这一点。<
  • 改用 Poem 对象的 Array,因为有时可以更轻松地检查其中是否包含您的对象。
  • 您还可以将关系/数组移至 Poem 类。现在,它将是喜欢这首诗的用户的关系/数组,它完成同样的事情,但这完全取决于您的偏好,以及它是否适用于您的所有查询(查找所有用户喜欢的诗,查找用户谁喜欢一首诗,看看有多少人喜欢这首诗)

祝你好运!

关于ios - query.whereKey 对于关系返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31632980/

相关文章:

swift - 无法将类型 '[String : String?]' 的值转换为预期的参数类型 '[NSObject : AnyObject]?'

swift - 如何使用 Parse 子类和 User 之间的关系 - Swift

ios - 带有 Cordova 垂直滚动的 Framework7 在 iOS 上不起作用

ios - 跨多个 UITableViewCells 拆分单个核心数据对象

ios - 根据元素的出现获取数组的子集

swift - 如何将图像存储到 UIImage 数组中(Swift)

ios - APNs 身份验证 key 是否会过期?

swift - ClosedRange<Int>.Swift 中 Int 的索引?

javascript - 使用数组或 JSON 来跟踪唯一列表

ios检测心率