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

Posted

技术标签:

【中文标题】CloudKit 光标错误和无法返回所有行 - 获取记录时遇到错误【英文标题】:CloudKit Cursor Error and Failing to Return all Rows - Encountered an error fetching records 【发布时间】:2017-06-03 23:08:45 【问题描述】:

我正在尝试从 CloudKit 数据库表中检索所有记录,以便与数组进行比较。当我从 CloudKit 进行查询时,出现一般错误。我通常会拿回一些记录,但不是全套。该表只有大约 6500 条记录。使用 true 的谓词,即没有谓词,我得到同样的错误。每次出错前返回的行数都不一样。

完全错误:

<CKQuery: 0x618000423e40; recordType=ActionFigureSale, predicate=saleEndTime > CAST(422923500.000000, "NSDate")> errored for <CKError 0x60000085b6c0: "Internal Error" (1/1000); "Encountered an error fetching records">

我尝试将 resultLimit 设置为 1000,但由于它多次排队,所以多次收到相同的错误。

        let publicDatabase = SharedData.sharedInstance.publicDatabase

        // let predicate = NSPredicate(value: true)
        let predicate = NSPredicate(format: "\(kSaleEndTime) > %@", saleEndTime)
        let query = CKQuery(recordType: kActionFigureSaleRecord, predicate: predicate)
        query.sortDescriptors = [NSSortDescriptor(key: kSaleSourceUniqueId, ascending: true)]

        var queryOperation = CKQueryOperation(query: query)
        queryOperation.queuePriority = .veryHigh
        queryOperation.resultsLimit = 10000

        var actionFigureItemSaleCloudRecordArray = Array<CKRecord>()
        var actionFigureItemSaleCloudArray = Array<ItemSale>()

        queryOperation.recordFetchedBlock =  (record) -> Void in
            actionFigureItemSaleCloudRecordArray.append(record)

            let actionFigureReference = record.object(forKey: kActionFigureReference) as! CKReference

            ...

            actionFigureItemSaleCloudArray.append(itemSaleItemCloud)
        

        queryOperation.queryCompletionBlock =  (cursor, error) -> Void in

            if error != nil 
                DispatchQueue.main.async 
                    #if DEBUG
                        print("WARNING:  Action Figure Sale iCloud query \(query) errored for \(error!)")
                    #endif

                    completion(nil, error)
                    return
                
            

            if cursor != nil 
                let newQueryOperation = CKQueryOperation(cursor: cursor!)
                newQueryOperation.cursor = cursor
                newQueryOperation.resultsLimit = queryOperation.resultsLimit
                newQueryOperation.queryCompletionBlock = queryOperation.queryCompletionBlock

                queryOperation = newQueryOperation

                publicDatabase!.add(queryOperation)
                return

            
            else 
                completion(actionFigureItemSaleCloudArray, nil)
                return
            
        

        publicDatabase!.add(queryOperation)
    

【问题讨论】:

【参考方案1】:

我遇到了同样的错误,我可以通过查看嵌套在 CKError 中的 userInfo 来解决这个问题。下面的代码是我在 queryCompletionBlock 中完成处理程序的一部分:

if error is CKError 
    let ckerror = error as! CKError
    let info = ckerror.userInfo
    for inf in info 
        NSLog("User-Info:\(inf.key):\(inf.value)")
    
    NSLog(error!.localizedDescription)

结果表明,我的 queryOperation.resultsLimit 的初始大小太高了。我将它降低到 400 并且错误消失了。

【讨论】:

以上是关于CloudKit 光标错误和无法返回所有行 - 获取记录时遇到错误的主要内容,如果未能解决你的问题,请参考以下文章

CloudKit iOS 10 错误:帐户无权访问 CloudKit 帐户

错误:无法从 CursorWindow 读取第 0 行 col -1。确保在访问数据之前正确初始化光标

Swift cloudkit CKFetchRecordZoneChangesOptions 无法返回删除记录

无法访问 CloudKit 出现奇怪错误:内部错误 (1/2005)

CloudKit 无法从公共容器中获取数据。错误 1/4000

替换 CloudKit 记录时遇到问题