2016-03-08 3 views
0

Я пытаюсь сделать CKQuery с предикатом, как:CloudKit: CKQuery предикат В массиве recordChangeTag

[NSPredicate [email protected]"recordChangeTag IN %@", @[record.recordChangeTag]] 

Описание выглядит как:

recordChangeTag IN {"ijrz21fi"} 

Ошибки CKQueryOperation с:

<CKError 0x7ff5cd3d2fc0: "Invalid Arguments" (12/1009); "Field '___etag' has a value type of NUMBER_INT64 and cannot be queried using filter value type STRING_LIST"> 

У каждого есть обходное решение для удаления котировок, чтобы он не преобразовывался в STRING_LIST при отправке на сервер? Или любые другие идеи, чтобы заставить его работать?

+0

Оберните 'NSString' в' NSNumber'. – rmaddy

+0

Я пробовал сканировать его как base 32 unsigned long long, но не работал. Что вы подразумеваете под оберткой? – malhal

ответ

-1

record.recordChangeTag - это строка. Из-за этого NSPredicate будет считать, что вы запрашиваете String и будете помещать кавычки вокруг значения. Вы должны сначала преобразовать его в число. Кроме того, я не думаю, что поле является списком, поэтому вы можете использовать = вместо IN.

Если вы используете Swift код будет выглядеть следующим образом: NSPredicate (формат:! "RecordChangeTag =% @", Int64 (record.recordChangeTag))

Но ... почему вы запрашивая recordChangeTag? Возможно ли это? Если да, то вы получите результат, только если запись не изменилась с тех пор, как вы получили changeTag. Не могли бы вы просто запросить идентификатор записи и проверить, не изменился ли changeTag?

+0

Я использую IN, потому что на самом деле у меня есть массив тегов изменений, но это та же ошибка с равными. Причина, по которой я запрашиваю тэг изменений, - это то, что я не хочу снова загружать запись, если у меня уже есть ее, и тег изменения однозначно идентифицирует версию записи, однако recordID и modifyDate также идентифицируют версию, но она более громоздка для проверьте несколько. – malhal

+0

Если вы сделаете это, чтобы показать/использовать новую информацию в своем приложении, вы можете решить эту проблему с подпиской. Затем будет нажата перемена, и вам не нужно ее вообще опроса. Если это происходит из-за того, что вы обновляете данные и хотите убедиться, что они не изменены, вам не следует делать это вообще. Вы должны просто выполнить обновление. Если он будет изменен, произойдет сбой, и вы получите обновленные данные в ошибке. Кроме того, ваша логика ошибочна. Он будет загружать только то, что у вас уже есть, а не изменено. –

+0

Я удалил NOT IN, чтобы упростить пример. Я не хочу подписки, потому что будет слишком много изменений для push, обновление при запуске приложения - это все, что мне нужно. И это не обновление для получения изменений. – malhal