Заполнение родительской ссылки (списка) в CloudKit дочерним recordName при создании дочерней записи - PullRequest
1 голос
/ 18 января 2020

Я пытаюсь создать дополнительные функции, помимо тех, которые включены в руководство по облачным комплектам (https://www.raywenderlich.com/4878052-cloudkit-tutorial-getting-started), и дошел до того, что у меня есть работающее приложение для просмотра заведений (ресторанов) и заметок о их - там, где я создал данные на панели инструментов CloudKit и предварительно заполнил записи «Имена заметок» в «Справочнике» заметок Учреждения.

Сейчас я расширяю приложение, чтобы разрешить пользователь, чтобы добавить заметки и в момент, когда я могу создать новую заметку, и заполнить recordName Учреждения (создание родительской сущности в дочерней записи) с помощью этого:

let noteRecord = CKRecord(recordType: "Note")
noteRecord["text"] = noteText.text //grabbed from a UIAlert

if self.establishment?.name != nil { //If the establishment exists
  let reference = CKRecord.Reference(recordID: self.establishment!.id, action: .deleteSelf)
  noteRecord["establishment"] = reference as! CKRecordValue
}
   //works fine, saves the new note as expected with the right recordName for the establishment
CKContainer.default().privateCloudDatabase.save(noteRecord) { [unowned self] record, error in
    DispatchQueue.main.async {
        if let error = error {
        } else {
        }
    }
}

Теперь проблема У меня есть способ, как получить recordName этой недавно сохраненной заметки и добавить его в список (список) Учреждения.

Причина в том, что способ, которым приложение было построено в учебнике - при получении всех Примечания для Учреждения - оно использует Справочник (Список) Учреждения. Если люди думают, что это не нужно в структуре данных, и достаточно просто иметь ссылку на родителя на ребенке, мне будет интересно плюсы и минусы этих подходов. Как вы можете сказать, я только учусь!

Есть идеи? Спасибо !!

Пожалуйста, дайте мне знать, если будет полезно больше подробностей

Модель данных для заметок - что имеет значение: "текст" = строка примечания и «Учреждение» = ссылка, в которой хранится Имя записи Учреждения Модель данных для Учреждения - важны «заметки», которые являются Справочником (Списком) записей Имен элементов Note.

GitHub-репозиторий здесь как ну: https://github.com/SteveBlackUK/BabiFudTutorial/blob/master/BabiFud/View%20Controllers/NotesTableViewController.swift <это контроллер вида, над которым я работаю </p>

1 Ответ

0 голосов
/ 19 января 2020

Хотя у меня все еще есть открытый вопрос о том, следует ли хранить родительские дочерние ссылки как в родительском, так и в дочернем (вероятно) ... Я наконец смог выяснить, как добавить ссылку на дочерний элемент обратно в родительская запись.

Напоминание: мы создаем Заметку о местоположении (Учреждение), и целью является сохранение ссылки на заметку в Справочнике (списке) в Учреждении в CloudKit.

//first, make sure we even have an establishment
  if self.establishment?.name != nil {
        //get the array of note references for the Establishment that we want to update
        let noteReferences = CKRecord.Reference(record: noteRecord, action: CKRecord_Reference_Action.deleteSelf)
//store the current array of note references into notesForEstablishment
        self.notesForEstablishment = self.establishment?.noteRecords
        if self.notesForEstablishment != nil {
          if !self.notesForEstablishment!.contains(noteReferences) {
            self.notesForEstablishment!.append(noteReferences)
          }
        } else {
          self.notesForEstablishment = [noteReferences]
          self.establishment?.noteRecords = self.notesForEstablishment
        }

        // get the record ID for the current establishment
        let establishmentRecordID = self.establishment?.id
        //then fetch the establishment from CK
        CKContainer.default().publicCloudDatabase.fetch(withRecordID: establishmentRecordID!) { updatedRecord, error in
          if let error = error {
            print("error handling to come: \(error.localizedDescription)")
          } else {
// then update the record and place the array that now holds the reference to the new note into the "notes" Reference (list) in CK
            updatedRecord!.setObject(self.notesForEstablishment as __CKRecordObjCValue?, forKey: "notes")
            CKContainer.default().publicCloudDatabase.save(updatedRecord!) { savedRecord, error in

            }
          }
        }
      }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...