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)