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
?
答案 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")
方法查询缺少密钥的数据。