【问题标题】:PFQuery where array of pointers contains a certain PFObjectPFQuery,其中指针数组包含某个 PFObject
【发布时间】:2015-08-25 15:11:52
【问题描述】:

我的类Deal 中的对象有一个属性relatedContacts,它是一个指向Contact 对象的指针数组。在删除Contact 之前,我正在运行以下查询以确定当前Contact 对象是否是任何Deal 中的指针的目标。

let relatedContactObjects:NSArray = [self.contactObject] as NSArray

let relatedContactQuery:PFQuery = PFQuery(className: "Deal")
    relatedContactQuery.fromLocalDatastore()
    relatedContactQuery.fromPinWithName("Deals")
    relatedContactQuery.whereKey("user", equalTo: PFUser.currentUser()!)
    relatedContactQuery.whereKey("relatedContacts", containsAllObjectsInArray: relatedContactObjects as [AnyObject])

但是,这会返回解析错误 102:“$all 查询不支持值类型。”

Parse documentationcontainsAllObjectsInArray 采用 NSArray,但 Xcode 显示警告 NSArray is not implicity convertible to [AnyObject]

有什么想法可以让这个查询工作吗?

编辑:我查看了relatedContacts的内容,似乎每个实例都包含一个字典数组,例如:[{"__type":"Pointer","className":"Contact","objectId":"BoLym053hX"},{"__type":"Pointer","className":"Contact","objectId":"AgpnxAFUBn"},{"__type":"Pointer","className":"Contact","objectId":"ob20tThdfp"}]

按照建议,我还查看了containedIn 查询约束,但它用于标识给定数组中包含的对象。我正在尝试识别包含给定对象的数组。

【问题讨论】:

  • 在顶部你有relatedContactObjects 作为一个NSArray,你为什么要把它转换成[AnyObject]?
  • Xcode 要求将其强制转换为 [AnyObject],但实际上我认为这不是问题所在。请查看我更新的问题。
  • 不要认为该方法支持kind of thing。你可能想试试containedInThis question may help.
  • 谢谢,但该约束用于识别给定数组中包含的对象。我正在尝试识别包含给定对象的数组。

标签: ios swift parse-platform


【解决方案1】:

Parse.com 重载 equalTo:允许它表示:(a) 单个属性等于操作数,或 (b) 数组属性包含操作数。所以你的目标很容易表述如下:

relatedContactQuery.fromPinWithName("Deals")
relatedContactQuery.whereKey("user", equalTo: PFUser.currentUser()!)
relatedContactQuery.whereKey("relatedContacts", equalTo:self.contactObject)

【讨论】:

  • 感谢您指出这一点。我认为 equalTo 更字面意思。为了完成您的回答,这里是我使用的 countObjects 查询:relatedContactQuery.countObjectsInBackgroundWithBlock{(count, error) -> Void in if (error == nil) { self.dealsPointingToContactCount = Int(count) }
  • 很高兴它有帮助。仅供参考:Parse.com 拒绝计数查询。根据计数,节省资源的替代方法可能是执行 find() 然后回答找到的集合的长度的云函数。
  • 很高兴知道。我在本地数据存储中运行查询,预期计数小于 100,所以这对我的情况应该没问题。
【解决方案2】:

在接受答案之前,我还尝试使用循环遍历数组并确定它们是否包含当前对象,然后增加一个计数。

var dealsPointingToContactCount:Int = 0
func countDealsRelatedToContact() {
    let dealsWithRelatedContactQuery:PFQuery = PFQuery(className: "Deal")
    dealsWithRelatedContactQuery.fromLocalDatastore()
    dealsWithRelatedContactQuery.fromPinWithName("Deals")
    dealsWithRelatedContactQuery.whereKey("user", equalTo:PFUser.currentUser()!)
    dealsWithRelatedContactQuery.whereKeyExists("relatedContacts")
    dealsWithRelatedContactQuery.findObjectsInBackgroundWithBlock{(objects, error) -> Void in

        if (error == nil) {

            var dealsWithPointersToContacts:NSArray = objects! as NSArray

            for deal in dealsWithPointersToContacts {

                var dealContactsArray:NSArray = deal["relatedContacts"] as! [PFObject]

                for contact in dealContactsArray {
                    if contact as! PFObject == self.object {
                        self.dealsPointingToContactCount++
                        println("Deals pointing to current contact: \(self.dealsPointingToContactCount)")
                    }
                }
            }  
        } 
    }
}

【讨论】:

  • 我认为您可以按照最初尝试的方式进行操作。这种方式没问题,但考虑到它会检索(使用网络资源和客户端内存)可能比需要的对象多得多。还有在本地测试上花费计算精力的问题。要通过查询获得您想要的,请澄清:每个相关联系人都在 relatedContactObjects 中的对象。另外,请注明relatedContacts列的类型....数组是什么?
  • relatedContacts 列是指向Contact 对象的指针数组。对于查询,relatedContactObjects 是一个只有一个对象的数组,因为containsAllObjectsInArray 需要一个 NSArray。我真的只想计算relatedContacts 包含self.contactObjectDeal 对象。
  • 这让你的目标很容易实现。
猜你喜欢
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
  • 2017-08-23
  • 2015-12-05
  • 1970-01-01
  • 2013-09-02
相关资源
最近更新 更多