query.whereKey为关系返回nil

时间:2015-07-26 02:10:55

标签: ios swift parse-platform

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()
        }
}

我可以在Parse Data Browser中看到它

现在我想检查当前用户是否喜欢我正在播放的诗歌:

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

2 个答案:

答案 0 :(得分:0)

欢迎来到stackoverflow!

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

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

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

另一方面,我在我的很多应用程序中都使用了解析,并且我已经了解到关系并不总是最好用的,当你使用它们时,弄清楚它们是什么类可能会很棘手在优化您的查询。这就是为什么在确定应用程序架构之前应始终牢记您的疑问的原因。您可以通过以下其他方式完成您想要完成的任务:

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

答案 1 :(得分:0)

您还可以使用Parse中的whereKeyDoesNotExist("key")方法查询缺少密钥的数据。