ParseSwift ParseObject QueryConstraint

Posted

技术标签:

【中文标题】ParseSwift ParseObject QueryConstraint【英文标题】: 【发布时间】:2021-06-01 09:49:58 【问题描述】:

我在一个 mongo DB 中有两个集合。

这是文档在第一个集合 (MainCollection) 中的外观:

_id
:"mzWqPEDYRU"
TITLE
:"ZAZ: I want."
ownerID
:"lGutCBY52g"
accessKey
:"0kAd4TOmoK0"
_created_at
:2020-03-13T11:42:11.169+00:00
_updated_at
:2020-03-13T17:08:15.090+00:00
downloadCount
:2

这是它在第二个集合(SecondCollection)中的样子:

_id
:"07BOGA8bHG"
_p_unit
:"MainCollection$mzWqPEDYRU"
SENTENCE
:"I love nature peace and freedom."
Order
:5
ownerID
:"lGutCBY52g"
AUDIO
:"07067b5589d1edd1d907e96c1daf6da1_VOICE.bin"
_created_at
:2020-03-13T11:42:17.483+00:00
_updated_at
:2020-03-13T11:42:19.336+00:00

第一个和第二个集合之间存在父子关系。在最后一个文档中,我们可以看到 _p_unit 字段,其中“mzWqPEDYRU”部分指向第一个集合中父级的 id。

我从以下代码开始就有一个问题:

func theFunction() 
    do MainCollection.query().find() 
            result in
            switch result 
            case .success(let items):
                print("items.count = \(items.count)")
                for item in items 
                    /// ....
                
            case .failure(let error):
                print("Error in \(#function): \(error)")
            
        
    

上面这段代码的编写方式很好,我得到了 MainCollection 中的元素数量,正如人们所期望的那样。但是,如果我将 MainCollection 替换为 SecondCollection,而不是将 SecondCollection 中的元素数替换为我会想。我收到如下错误:

ParseError(code: ParseSwift.ParseError.Code.unknownError, 
message: "Error decoding parse-server response: 
Optional(<NSHTTPURLResponse: 0x2837211a0>  URL: 
 Status Code: 200, Headers  ) with error: 
The data couldn’t be read because it isn’t in the correct format.
Format: Optional(\"\\\"results\\\": .......

谁能指出这是什么原因造成的?

【问题讨论】:

【参考方案1】:

类似于:

var SecondCollection.query(unit == documentOne).find()

【讨论】:

尝试听从您的建议,我总是收到此错误:“在范围内找不到'单元'”。我已经检查了该单元是否存在于我认为应该存在的位置,但我一定遗漏了一些细节。 @Davi_Macêdo。经过几次试验,我需要问“单位”应该来自哪里。我认为这是 SecondCollection 中的一个字段;但我所有的测试似乎都表明我的假设是错误的。 SecondCollection 中有一个名为 unit 的字段,对吧? 是的!我确实有这样的领域。但是,在尝试一些事情时,我注意到了与此相关的一些事情。用 SecondCollection 的另一个字段替换 unit 会带来相同的错误消息。这表明虽然 SecondCollection 本身在范围内是已知的,但它的字段似乎是未知的。 您能否分享有关如何创建和实例化 SecondCollection 以及查询的代码?【参考方案2】:

.query() 方法在键/值方案中工作,因此它应该将键作为字符串传递,将值作为引用类型传递,因此在双引号之间传递“单位”是正确的:

do SecondCollection.query("unit" == cell).find() 

您遇到的错误是因为 cell 是 Parse.Object 并且它期望在那个地方有一个值(在这种情况下是一个属性)。

请尝试以下方法,看看它是否适合您:

do SecondCollection.query("unit" == cell.id).find() 

【讨论】:

我已尝试按照您的建议将“cell”替换为“cell.id”,但它不起作用。我也试过用“cell.objectId”替换“cell”,它也失败了。 您使用的是哪个版本的框架?另外,你能不能试试这个:做 SecondCollection.query("unit" == cell).includeAll().find() 甚至:做 SecondCollection.query("unit" == cell).include("单位").find() 我正在使用 ParseSwift 1.7.1 并且从未使用过任何其他版本。至于尝试您的建议,它失败了。另一方面,我尝试了“do SecondCollection.query().find() ”并得到了一些结果,当然没有像我最终想要的那样对单元进行过滤。但问题是,我没有获得成功的结果,而是将信息嵌入到错误消息中。喜欢:错误:ParseError(代码:ParseSwift ....未知,msge:“错误解码解析服务器响应:..错误:数据..不是..正确格式。格式:可选(\” “结果”:[“objectId”:“07BOGA8bHG”, @Alex_Kusmenkovsky。在你的最后评论之后深入挖掘我的问题让我意识到我必须在更高的层次上解决这个问题。所以我重写了这篇文章以反映这一点。我希望你能再看看它,让我们知道你的想法。 花了不少时间,我才发现“AUDIO: String?”这一行在我的第二个集合的声明中引起了很多麻烦。这意味着删除它允许我列出集合中的元素,而无需任何过滤。而且我仍然需要弄清楚我应该为 AUDIO 使用什么类型而不是使用 String。此 AUDIO 字段只是指向服务器上的音频文件。

以上是关于ParseSwift ParseObject QueryConstraint的主要内容,如果未能解决你的问题,请参考以下文章

ParseSwift.initialize 显示无法转换类型错误的值

ParseSwift queryConstraint 对象

ParseSwift SDK 中的 ParseKeyValueStore,backingStore 意外发现 nil

ParseObject 的使用简介简单易懂

json.parseobject()的set方法设置顺序

在用户类中查询 ParseObject(Pointer)