Запись в предыдущий объект области вместо следующего - PullRequest
0 голосов
/ 13 ноября 2018

Я совершенно новичок в Realm и пытаюсь добавить некоторые данные в свою базу данных. У меня есть тренировки, которые состоят из упражнений. Каждая тренировка имеет идентификатор, дату и список упражнений. В моем табличном представлении я создаю два тренинга, каждый из которых имеет свой идентификатор, после чего я добавляю несколько упражнений к первому, а когда пытаюсь добавить ко второму, я получаю сообщение об ошибке: «Попытка создать объект типа «TrainingExercise» с существующим значением первичного ключа «Thruster». " Я не понимаю, почему он пытается добавить это к предыдущему обучению. Я получаю обучение по идентификатору из базы данных, и я проверил, передается ли правильный идентификатор в функцию и все. Но когда я ставлю точку останова, идентификатор тренировки остается прежним, и я не могу понять причину этого. Может ли кто-нибудь помочь мне решить это? Вот моя тренировочная модель:

    class Training: Object {

    @objc dynamic var id = 0
    @objc dynamic var date = NSDate()
    var exercises = RealmSwift.List<TrainingExercise>()

    convenience init(date: NSDate, exercise: TrainingExercise) {
        self.init()
        self.date = date
        self.exercises.append(exercise)
    }

    override class func primaryKey() -> String? {
        return "id"
    }
}

Вот моя модель упражнений:

 class TrainingExercise: Object {

    @objc dynamic var name: String = ""
    let sets = RealmSwift.List<GymSet>()


    convenience init(name: String, gymSet: GymSet) {
        self.init()
        self.name = name
        self.sets.append(gymSet)
    }

    override class func primaryKey() -> String? {
        return "name"
    }
}

class GymSet: Object {


    @objc dynamic var reps: Int = 0
    @objc dynamic var kilos: Double = 0
    @objc dynamic var time: String = ""

}

А вот функция, которую я использую, чтобы добавить упражнения к тренировке

func addExerciseForTraining(trainingId: Int, exercise: TrainingExercise) {

    let training = getTrainingById(id: trainingId)

    try? database.write {
        training.exercises.append(exercise)
    }

    try? database.write {
        database.create(Training.self, value: training, update: true)
    }
}


func getTrainingById(id: Int) -> Training {
    let training = database.object(ofType: Training.self, forPrimaryKey: id)

    return training!
}

1 Ответ

0 голосов
/ 13 ноября 2018

Вам нужно правильно установить отношения между вашими классами.Итак, попробуйте заменить ваши классы следующим образом:

class Training: Object {
    @objc dynamic var id = 0
    @objc dynamic var date = NSDate()
    var exercises = List<TrainingExercise>()
}

class TrainingExercise: Object {
    @objc dynamic var name: String = ""
    var training = LinkingObjects(fromType: Training.self, property: "exercises")
    var sets = List<GymSet>()
}

class GymSet: Object {
    @objc dynamic var reps: Int = 0
    @objc dynamic var kilos: Double = 0
    @objc dynamic var time: String = ""
    var exercise = LinkingObjects(fromType: TrainingExercise.self, property: "sets")
}

Теперь, когда вы хотите создать новый, создайте его следующим образом

let training = Training()

, если вы хотите изменить какое-либо его свойство, используйте этонапример

try? database.write {
    training.id = 1
}

и чтобы добавить свое обучение в базу данных, используйте этот

try? database.write {
    database.add(training)
}
...