【问题标题】:iOS - Relational Queries using Parse.com FrameworkiOS - 使用 Parse.com 框架的关系查询
【发布时间】:2015-02-07 20:38:57
【问题描述】:

我使用 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)

【问题讨论】:

    标签: ios swift parse-platform


    【解决方案1】:

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

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

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

    “includeKey”方法将关系类作为对象返回。由于我在 User_To_Squad 类中的用户和小队列都是指针,因此效果非常好,并且可以在一个查询中完成。

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

    【讨论】:

      【解决方案2】:

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

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

      对于我的用例,ParseFollower 类尚未在 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!)
      

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

      【讨论】:

        【解决方案3】:

        或者,您可以通过以下博客文章更改您的数据模型: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())
        

        【讨论】:

        • 有趣。与我现有的关系风格相比,多对多模式有什么好处吗?
        • 好吧,我想说:这取决于你想要做什么。您当前的模型遵循传统的 SQL 风格的数据建模,而我建议的模型更倾向于 NoSQL 方法。两者都有优势。更一般地说,NoSQL 方式可能更好如果您非常了解所有用例。稍后在您的应用程序中可能会出现某些情况,出于效率原因,您还需要在 User 模型中存储团队列表,这将是一件令人头疼的事情,因为您需要管理两个关系列表,从数据一致性的角度来看,这是相当糟糕的。
        • 当然。我现在这样做的主要原因之一是因为 User_To_* 表将有另一个字段用于其他类型的标志。例如,我的 User_To_Event 表跟踪每个用户到他们被邀请的每个邀请,但也为他们的 RSVP 状态(即,Going、Not going、Tentative)保存一个标志。我对 NoSQL 结构并不太熟悉。知道如何在不按照我的方式做的情况下做到这一点吗?
        • 我不能 100% 确定,但在这种情况下,我认为您需要保留当前的数据模型,并在 User_To_Squad 表中添加 status 列。考虑到 Parse 目前如何处理这种数据关系,它也会影响您的查询计数,从而影响您的月度账单......
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-16
        • 1970-01-01
        相关资源
        最近更新 更多