Xcode 7 Beta 4

我有Parse.com的Poem类。在我的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: poem!)还给我nil

最佳答案

欢迎来到stackoverflow!

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

因此,对于您要执行的操作,请除去query.whereKey("likedPoem", equalTo: poem!)约束,然后针对要显示的诗对象检查结果。

现在,这仅起作用,因为您有一个Poem对象,并且您正在调用query.getFirstObjectInBackgroundWithBlock。将来(如果用户喜欢更多的诗歌),您将需要对其稍作修改并将其更改为query.findObjectsInBackgroundWithBlock,以便可以检索所有喜欢的诗歌的数组,然后可以检查是否所显示的诗就在那个阵列中。

附带说明一下,我在很多应用程序中都使用了parse,并且我了解到关系并非总是最适合使用,当您使用它们时,弄清楚将它们放在哪个类中进行优化可能很棘手。您的查询。这就是为什么在确定应用程序的架构之前应始终牢记查询的原因。您可以通过以下其他方式来完成自己想做的事情:


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


祝好运!

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

10-10 20:15