Ошибка при получении нескольких результатов в CK-запросе, когда одна и та же запись может быть возвращена более одного раза - PullRequest
0 голосов
/ 02 мая 2020

У меня есть таблица в CloudKit (UserCourse), которая содержит ссылку на пользователя, ссылку на курс и различные сводные данные для этой комбинации пользователя + курс (например, дата начала, статус и т. Д. * 1014). *). Пользователь может выбрать один и тот же курс несколько раз.

В одном представлении моего приложения я показываю количество пройденных пользователем курсов - этот запрос работает нормально и показывает общее количество, включая дублированные версии комбинация пользователь + курс.

После этого у меня появится последующее представление, в котором я хочу перечислить все курсы, пройденные зарегистрированным пользователем, с подробной информацией о курсе. Моя проблема в том, что я могу получить только одну копию курса, которая была продублирована.

Сначала у меня есть запрос, который получает все записи из таблицы UserCourses для этого пользователя. По результатам я получаю ссылки на все курсы и передаю их в качестве входных данных для последующего запроса, который пытается получить все курсы из CK, чтобы я мог отобразить представление пользователю всех курсов, которые они прошли.

Проблема в том, что я не могу получить две копии одного и того же курса (например, один в процессе и один завершенный, например). Я пытался сделать запрос по recordName, но я понимаю, что это невозможно. Однако, когда я пытаюсь выполнить преобразование из recordName в Record ID (ниже) - я получаю разные идентификаторы записей для одного и того же имени записи, и мой запрос возвращает только один экземпляр курса, а не два.

    recordIDs.append(CKRecord.ID(recordName: recordName))

и соответствующий код ниже. Открыты для предложений о том, как решить эту проблему. Я полагаю, я поступаю неправильно, и мои запросы должны разрабатываться иначе!

 func getCoursesByReference(for references: [CKRecord.Reference],
                              _ completion: @escaping ([Course]?,Error?) -> Void) {
    var recordIDs: [CKRecord.ID] = []

    for each in references { //loop through the references being passed in
 // and because you can't query by recordName in cloudkit, then convert to record ID

        var recordName = each.recordID.recordName
        recordIDs.append(CKRecord.ID(recordName: recordName))
    }

    //my predicate now has two different record IDs for the same recordName and as such my results set is 1 item instead of two

    var predicate = NSPredicate(format: "recordID IN %@", recordIDs)
    let query = CKQuery(recordType: "Course", predicate: predicate)

    ....remainder of code
...