Дайте мне посмотреть, смогу ли я ie все это вместе.
1) У вас есть известный конкурс и известная викторина, и вы хотите добавить нового лидера LB в викторину. Есть несколько способов справиться с этим, но вот длинный ответ:
Во-первых, я организовал два конкурса с контестом 0 с двумя тестами и контестом 1 с одним тестом. Вывод его на консоль приводит к
contest 0
quiz 0
quiz 1
contest 1
quiz 2
Затем, предположим, я хочу добавить нового LBLeader, John, на конкурс 0, викторина 1. Вот код.
let knownContest = "contest 0"
let knownQuiz = "quiz 1"
let leaderToAdd = LBLeaders()
leaderToAdd.userName = "John"
let contestResults = realm.objects(LBContests.self).filter("contestName == %@", knownContest)
if let thisContest = contestResults.first {
let quizResults = thisContest.childrenLBQuizzes.filter("quizName == %@", knownQuiz)
if let thisQuiz = quizResults.first {
try! realm.write {
thisQuiz.childrenLBLeaders.append(leaderToAdd)
}
}
}
и при печати той же информации Джон добавляется в конкурс 0, викторина 1.
contest 0
quiz 0
quiz 1
John
contest 1
quiz 2
Существуют и другие способы выполнить sh то же самое (например, более короткий ответ). Например, этот вкладыш возвращает тот же тест и использует обратную связь
let quizResults = realm.objects(LBQuizzes.self).filter("quizName == %@ AND ANY parentContest.contestName == %@", knownQuiz, knownContest)
2) Объекты, результаты и списки - это три различных концепции Царства, которые довольно подробно описаны в Документация Царства .
Говоря в общем:
Объект Realm - это отдельный экземпляр объекта, например Person или Dog. (существует ряд вещей, которые считаются «объектами области», но мы будем ограничивать их для краткости)
Результаты области (объект) - это набор объектов, возвращаемых из базы данных области. Имея в виду, что, как показано в моем первом решении, сначала возвращаютсяtestResults, но затем я могу получить подмножество этих объектов в quizResults. Кроме того, результаты Realm обновляются в реальном времени - они остаются «привязанными» к базе данных, так как объекты входят или выходят из области результатов, результаты всегда отражают это.
Список - это «контейнер», который определяет отношения один ко многим. Очень похоже на массив и имеет много одинаковых функций. У человека много собак, так что это был бы хороший вариант использования Списка, который вы, похоже, делаете. Одна проблема - обратная связь LinkingObjects. Обратите внимание на его LinkingObjects (множественное число), поэтому, если вы используете это, имейте в виду, что это также означает, что собака может иметь много людей. Преимущество состоит в том, что он автоматически создает эти отношения при записи данных, но недостатком является то, что это не единичные обратные отношения, поэтому вы должны соответствующим образом кодировать (используя .first, как в моем примере).
3) ОГРОМНОЕ вопрос и на самом деле не несет ответственности в рамках SO, поскольку потребовалось бы МНОГО документации для объяснения всех этих взаимодействий.
Некоторая пища для размышлений:
Первичные ключи может, часто, сделать вещи намного проще и быстрее, работая со связями, так как указанные c объекты могут быть адресованы их уникальным первичным ключом вместо того, чтобы полагаться на запросы, в данном случае, имени теста.
Например, если все ваши объекты имеют первичный ключ, добавление нового лидера в заданную c викторину становится
class LBQuizzes: Object {
@objc dynamic var quiz_id = UUID().uuidString
, а затем вы можете получить этот указанный c объект через его quiz_id и добавить Лидер.
let quizId = //whatever the primary key is of this quiz object
let quizObject = realm.object(ofType: LBQuizzes.self, forPrimaryKey: quizId)
try! realm.write {
quizObject?.childrenLBLeaders.append(leaderToAdd)
}