[英]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”列是指向User和Team类的指针。
我正在尝试以一种可以向我展示与用户关联的所有团队的方式查询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 {
...
}
我有文档,但是他们没有提供很多示例。
我收到以下错误:
[错误]:$ inQuery的错误类型(代码:102,版本:1.6.1)错误:错误域=分析代码= 102“无法完成操作。(分析错误102。)” UserInfo = 0x1702779c0 {error = $ inQuery的错误类型,代码= 102},[错误:$ inQuery的错误类型,代码:102]
- -编辑 - -
我现在正在尝试以下操作,该操作不再产生错误,但也不产生任何结果。 我还将“团队”更改为“小队”,因为在该应用程序中将团队称为小队。 对我来说更干净。
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)
我最终仅通过使用Parse中的“ includeKey”方法就解决了这个问题。
我的查询现在看起来像这样:
var query = PFQuery(className: "User_To_Squad")
query.includeKey("squadId")
query.whereKey("userId", equalTo: PFUser.currentUser())
query.findObjectsInBackgroundWithBlock {
...
}
“ includeKey”方法将关系类作为对象返回。 由于User_To_Squad类中的user和squad列都是指针,因此这工作得非常好,并且可以在一个查询中完成。
解析查询文档对此进行了详细介绍。
对于其他有此问题并且不想更改其数据模型或查询的人,这是我发现的。
问题在于该类不是在Parse的服务器上创建的。 在尚不存在的类上执行嵌套查询会导致类型错误。 修复此问题所需要做的就是创建类以及要查询的列。
对于我的用例,尚未在Parse服务器上创建ParseFollower类,这导致我为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!)
我根本没有更改此代码,只是在服务器上创建了该类,问题就消失了。 希望这对其他人有帮助。
或者,您可以通过以下博客文章来更改数据模型: http : //blog.parse.com/2012/03/28/parse-supports-many-to-many-relations/
解析可以处理多对多关系(例如球员和球队)。 基本上,您只需PFObject
代表您的用户的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())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.