Как сделать запрос CloudKit по lastModifiedUserRecordID? - PullRequest
5 голосов
/ 29 июня 2019

На основании документации Apple, lastModifiedUserRecordID - это системное поле, которое автоматически генерируется в iCloud.

Я хочу получить записи из общедоступной базы данных iCloud, которая была в последний раз изменена мной.

Я установил «ifiedBy »как« Запрашиваемый »на панели инструментов CloudKit и добавил этот предикат:

let userId = CKRecord.Reference(recordID: userCKRecordID, action: .none)
lastModifiedPred = NSPredicate(format: "lastModifiedUserRecordID = %@", userId)

И это не возвращает никаких результатов. Если я удаляю этот предикат, он возвращает 1 результат, и на информационной панели я вижу, что последний измененный идентификатором записи (recordName) совпадает с именем пользователя recordName, которое я отправляю.

Как ни странно, использование "creatorUserRecordID" и передача того же значения, что и выше, возвращает правильные результаты, но мне нужен lastModifiedBy.

РЕДАКТИРОВАТЬ: В соответствии с предложениями я попытался использовать фактическое userCKRecord.recordName в качестве строки и отправить этот предикат в CloudKit.

lastModifiedPred = NSPredicate(format: "lastModifiedUserRecordID = %@", userCKRecord.recordName)

и получил эту ошибку:

"Поле \ '___ifiedBy \' имеет тип значения REFERENCE и не может быть запрашивается с использованием значения фильтра типа STRING "

Как я уже упоминал выше, я могу нормально запросить creatorUserRecordID, используя исходный предикат вверху (используя CKRecord.ID), но он просто не работает для lastModifiedUserRecordID.

Ответы [ 3 ]

1 голос
/ 13 июля 2019

Поскольку вы хотите получить записи, которые были изменены вами в последний раз, вы должны сначала получить UserRecordID.Это делается путем вызова

fetchUserRecordID(completionHandler: { (myUserRecordID, error) in
… // see below
}  

см. документы .Таким образом, вы получаете своего пользователя myUserRecordID.
. С его помощью вы можете настроить предикат запроса:

let lastModifiedPred = NSPredicate(format: "lastModifiedUserRecordID = %@", myUserRecordID)  

и выполнить ваш запрос.

0 голосов
/ 12 июля 2019

На основе документации Apple для https://developer.apple.com/documentation/cloudkit/ckrecord/id

CKRecord.ID -> идентификатор класса: NSObject

Объект идентификатора записи состоит из строки имении идентификатор зоны.Строка имени представляет собой строку ASCII длиной не более 255 символов.

Сравнение объекта и строки не даст вам результата, попробуйте привести CKRecord.ID, так как String может помочь

0 голосов
/ 29 июня 2019

Вы используете NSPredicate для сравнения строкового литерала. Где userId не является строковым литералом. Используйте это.

lastModifiedPred = NSPredicate(format: "lastModifiedUserRecordID = %d", INT-VALUE-OF-userId)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...