我的架构如下
RecordType:OwnedEvents 包含一个名为“Owner”的元素。此 Owner 元素指向从“OwnedEvents”类型的 RecordType 创建的 CKReference。
我有 N 个 OwnedEvents 对象都指向一个 Owner 对象。
当我执行查询以检索指向给定 Owner 对象的所有记录时,我发现在某些情况下,查询不会返回指向它的所有记录(在大多数情况下它确实返回它)。它也不会在完成块中返回错误。当我转到 CloudKit 仪表板时,我看到所有 OwnedEvents 对象都指向相同且正确的 Owner 对象,正如预期的那样。我用来检索的代码如下。
我的问题是:
这种“无声”的失败是意料之中的吗?即我需要识别并恢复吗?或者我在查询中做错了什么?
如果不是所有符合条件的记录都被检索到,有没有办法说查询必须返回错误?(即 fetch 的原子版本..我猜不是,因为很难提前知道预期的匹配记录数是多少,但我想知道是否可以在 fetch 或架构中指定一些内容提示获取结果中预期的最小记录数)。
与使用“获取列 X > N1 和列 X 的 OwnedEvents 类型的所有记录”形式的谓词相比,使用使用引用形成的谓词进行提取是否更有效
- 引用指向同一组记录,N1...N2
- 即,如果基于参考的检索将不可靠,我不妨远离它并采取蛮力方法,如果它不是更快的话。至少在后者我有一个简单的方法来识别错误
使用的代码
CKReference* recordToMatch = [[CKReference alloc] initWithRecordID:eventCollectionID
action:CKReferenceActionDeleteSelf]; //eventCollectionID is recordID of Record of type Owner
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"Owner == %@", recordToMatch];
// Create the query object.
CKQuery* query = [[CKQuery alloc] initWithRecordType:@"OwnedEvents" predicate:predicate];
CKQueryOperation *queryObject = [[CKQueryOperation alloc] initWithQuery:query] ;
queryObject.queryCompletionBlock = ^(CKQueryCursor * cursor, NSError * operationError) {
if(operationError)
{
DDLogError(@"Error %@ occured during query",operationError) ;
}
else if(cursor)
{
DDLogVerbose(@"Not all objects satisfying the query were returned. Need to get next batch") ;
//To do fetch remaining entries
CKQueryOperation *queryObject = [[CKQueryOperation alloc] initWithCursor:cursor] ;
//Execute another query with this object
}
else
{
DDLogVerbose(@"All objects satisfying the query were returned") ;
//Take appropriate action with rcvd data
}
} ;
queryObject.recordFetchedBlock = ^(CKRecord *record) {
DDLogVerbose(@"Received record with seq Num: %@, type",record[@"SequenceNumber"],record[@"EventType"]) ;
//Check if items are in sequence
} ;
[self.publicDatabase addOperation:queryObject] ;