CloudKit 返回太多记录

Posted

技术标签:

【中文标题】CloudKit 返回太多记录【英文标题】:CloudKit returns too many records 【发布时间】:2016-04-11 10:18:55 【问题描述】:

我目前正在将我的数据从 Parse 移植到 CloudKit。我能够将我的数据导入 CloudKit 结构,但现在我没有收到正确数量的记录。我收到了 289 条记录,而不是 52 个用户(显示在仪表板中)。我用简单的CKQueryCKQueryOperation 进行了尝试。

CKQuery 由于限制返回 100 个结果,当我使用 CKQueryOperation 时,我收到 289 个结果,其中包含许多重复条目。

我使用以下代码(CKQuery 方式..)来获取我的所有用户:

let query = CKQuery(recordType: "User", predicate: NSPredicate(value:true))

let container = CKContainer.defaultContainer()
let publicDB = container.publicCloudDatabase

publicDB.performQuery(query, inZoneWithID: nil)  (records, error) in
    print("USER public count: \(records?.count)")

对于 CKQueryOperation,我编写了一个帮助库,它可以将结果自动移植到一个快速的类结构中。

let uw = ROCloudBaseWebservice<User>()

uw.load  (data) in
    logger.debug("User count (CKQueryOperation): \(data.count)")

如果您想查看此加载中的代码,可以在此处查看: https://github.com/prine/ROCloudModel/blob/master/Source/ROCloudBaseWebservice.swift

我的其他 3 个表也有同样的情况,我也得到了错误的数据量。只有一个有 4 个条目的表正在接收正确的数据量。

其他人有这个问题吗?我在表中使用引用。这会导致问题吗?

【问题讨论】:

【参考方案1】:

我刚刚发现,CloudKit 中有一个错误,已删除的记录以某种方式隐藏仍然可用。我重置了我的开发环境并再次导入数据,我得到了正确数量的返回记录。

更多信息可以在这个 *** 帖子中找到: Deleted CloudKit records Reappear

【讨论】:

【参考方案2】:
    func loadAllClients() 
        let pred = NSPredicate(value: true)            
        let sort = NSSortDescriptor(key: "Nome", ascending: true)
        let query = CKQuery(recordType: "Cliente", predicate: pred)
        query.sortDescriptors = [sort]

        let operation = CKQueryOperation(query: query)
        operation.desiredKeys = ["Nome", "Endereco","Telefone","Email","Observacao","Quartos","Banheiros","Frequencia","ValorPadraoST","ValorPadraoDC","ValorPadraoMC","Marketing","MensagemData","QtdAtendimento","ultimoAtendimento","DeuReview"]
        operation.resultsLimit = 400

        var newWhistles = CLIENTES

        operation.recordFetchedBlock =  record in
            newWhistles.append(record)
        


        operation.queryCompletionBlock =  [unowned self] (cursor, error) in
            DispatchQueue.main.async 
                if error == nil 
                    //ViewController.isDirty = false
                    self.clienteRecords = newWhistles
                    //self.tableView.reloadData()


                    print("clienteRecords \(self.clienteRecords.count)")

                 else 
                    let ac = UIAlertController(title: "Fetch failed", message: "There was a problem fetching the list of CLIENTES; please try again: \(error!.localizedDescription)", preferredStyle: .alert)
                    ac.addAction(UIAlertAction(title: "OK", style: .default))
                    self.present(ac, animated: true)
                
            
        

        database.add(operation)
    

【讨论】:

您能在您的代码中添加一些解释吗?它是如何解决问题的? 首先创建一个 var clienteRecords = [CKRecord] 然后调用这个函数并填充 ClienteReocrds。试试吧!

以上是关于CloudKit 返回太多记录的主要内容,如果未能解决你的问题,请参考以下文章

CloudKit 光标错误和无法返回所有行 - 获取记录时遇到错误

Cloudkit 返回具有特定字符串的记录

CloudKit,NSPredicate 在私有容器中返回计数或确定是不是存在任何记录?

CloudKit 查询操作只返回 300 个结果

CloudKit 批量获取?

Swift cloudkit CKFetchRecordZoneChangesOptions 无法返回删除记录