1

私のスキーマは次のとおりです

RecordType: OwnedEvents には、「Owner」という要素が含まれています。この Owner 要素は、「OwnedEvents」タイプの RecordType から作成された CKReference を指します。

N 個の OwnedEvents オブジェクトがすべて 1 つの Owner オブジェクトを指しています。

特定の Owner オブジェクトを指すすべてのレコードを取得するクエリを実行すると、場合によっては、そのオブジェクトを指すすべてのレコードが返されないことがわかります (ほとんどの場合、返されます)。また、完了ブロックでエラーを返しません。CloudKit ダッシュボードに移動すると、すべての OwnedEvents オブジェクトが同じ正しい Owner オブジェクトを指していることがわかります。取得に使用しているコードは以下のとおりです。

私の質問は次のとおりです。

  1. この種の「サイレント」障害は予想されますか? つまり、これを特定して回復する必要がありますか? または、クエリで何か間違ったことをしていますか?

  2. 基準に一致するすべてのレコードが取得されない場合、クエリがエラーを返さなければならないと言う方法はありますか? (つまり、フェッチのアトミックバージョン..一致するレコードの予想数を事前に知るのは難しいため、そうではないと思いますが、フェッチまたはスキーマで指定できるものがあるかどうか疑問に思っていますフェッチ結果で予想されるレコードの最小数を示します)。

  3. 形式の述語を使用するフェッチと比較して、参照を使用して形成された述語を使用してフェッチする方が効率的ですか?

    • 参照は同じレコード セット 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] ;
4

0 に答える 0