Search code examples
iosnspredicatecloudkit

CloudKit - NSPredicate for finding all records that contain specified CKReference in a reference list


I am working on a CloudKit backed app with a Users record type that has a "following" reference list attribute. I am trying to construct a query to get every user that is following a specified user (i.e. those users in which the specified user appears as an entry in the following reference list).

I am currently trying to construct my NSPredicate for the CKQuery as such:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ IN following", [[CKReference alloc] initWithRecordID:currentUserID action:CKReferenceActionNone]];
CKQuery *query = [[CKQuery alloc] initWithRecordType:UserRecordType predicate:predicate];

And CloudKit returns the following error message:

"Unknown Item" (11/2003); server message = "did not find required record type";

I feel I might be missing something pretty straight forward in my predicate. Any help would be greatly appreciated!


Solution

  • Use CONTAINS operator to test list membership:

    CKReference* recordToMatch = [[CKReference alloc] initWithRecordID:currentUserID action:CKReferenceActionNone];
    NSPredicate* predicate = [NSPredicate predicateWithFormat:@"following CONTAINS %@", recordToMatch];
    

    If you want to query for more than 1 reference, then you need to use a compound predicate with AND predicate type for each reference in list.