iOS - 使用 Parse.com 框架的关系查询

iOS - Relational Queries using Parse.com Framework

我正在使用 Parse.com 作为我的应用程序的后端。在后端我有以下 类:

User (objectId, name, username, password, etc)
Team (objectId, teamName, etc)
User_To_Team (objectId, teamId, userId)

"teamId" 和 "userId" 列是指向用户和团队的指针 类。

我正在尝试以某种方式查询 Parse,以便向我显示用户关联的所有团队。我尝试了以下方法,但不起作用。

 var innerQuery = PFQuery(className: "User_To_Team")
 innerQuery.whereKey("userId", equalTo: PFUser.currentUser())
 var query = PFQuery(className:"Team")
 query.whereKey("objectId", matchesQuery:innerQuery)
 query.findObjectsInBackgroundWithBlock {
     ...
 }

我有文档,但他们没有提供很多示例。

我收到以下错误:

[Error]: bad type for $inQuery (Code: 102, Version: 1.6.1) Error: Error Domain=Parse Code=102 "The operation couldn’t be completed. (Parse error 102.)" UserInfo=0x1702779c0 {error=bad type for $inQuery, code=102}, [error: bad type for $inQuery, code: 102]

---编辑---

我现在正在尝试以下操作,它不再生成错误,但也不会生成任何结果。我还将 "Team" 更改为 "Squad",因为团队在应用程序中将被称为 Squads。对我来说更干净。

var innerQuery = PFQuery(className: "User_To_Squad")
innerQuery.whereKey("userId", equalTo: PFUser.currentUser())
var query = PFQuery(className:"Squad")
query.whereKey("objectId", matchesKey: "squadId", inQuery: innerQuery)

或者,您可以通过关注此博客 post 来更改您的数据模型:http://blog.parse.com/2012/03/28/parse-supports-many-to-many-relations/

Parse 可以处理多对多关系(比如球员和球队)。基本上,您只需要将代表您的用户的 PFObject 数组保存到您的团队 PFObject.

var team = PFObject(className: "Team")
team.setObject(p, forKey: "players") // here, p is an array containing PFObject corresponding to the User class
team.setObject("Ferrari", forKey: "teamName")
// ...
team.saveInBackground()

之后,您应该可以用一条语句进行查询:

var query = PFQuery(className: "Team")
query.whereKey("players", equalTo: PFUser.currentUser())

我最终通过简单地使用 Parse 中的 "includeKey" 方法解决了这个问题。

我的查询现在看起来像这样:

var query = PFQuery(className: "User_To_Squad")
query.includeKey("squadId")
query.whereKey("userId", equalTo: PFUser.currentUser())
query.findObjectsInBackgroundWithBlock {
    ...
}

"includeKey" 方法 returns 关系 class 作为一个对象。由于我在 User_To_Squad class 中的 user 和 squad 列都是指针,这非常有效并且在一个查询中完成。

Parse Query Documentation 很好地涵盖了这一点。

对于遇到此问题并且不想更改其数据模型或查询的其他人,这是我发现的。

问题是 Class 不是在 Parse 的服务器上创建的。对尚不存在的 class 执行嵌套查询会导致类型错误。要修复它,您需要做的就是创建 class 以及要查询的列。

对于我的用例,ParseFollower class 尚未在 Parse 服务器上创建,这导致我得到 inQuery 错误的错误类型。

let fromQuery = ParseUserInfo.query()
fromQuery?.includeKey("username")
fromQuery?.whereKey("username", equalTo:myUsername)

let fromFollowerQuery = ParseFollower.query()
fromFollowerQuery?.includeKey("to")
fromFollowerQuery?.includeKey("from")
fromFollowerQuery?.whereKey("from", matchesQuery: fromQuery!)

我根本没有更改此代码,我只是在服务器上创建了 class,问题就消失了。希望这对其他人有帮助。