首页 > 解决方案 > 写入前一个领域对象而不是下一个

问题描述

我是 Realm 的新手,我正在尝试为我的数据库添加一些数据。我有一个由练习组成的培训。每个训练都有 ID、日期和练习列表。在我的表格视图中,我创建了两个培训,每个培训都有自己的 id,之后我向第一个添加一些练习,当我尝试添加到第二个时,我收到一个错误:“尝试创建类型的对象'TrainingExercise' 与现有的主键值 'Thruster'。” 我不明白为什么它会尝试将此添加到以前的培训中。我从数据库中通过 id 接受培训,然后检查是否将正确的 id 传递给函数,仅此而已。但是当我放断点时,训练的 id 是以前的,我不明白这是为什么。有人可以帮我解决这个问题吗?这是我的训练模型:

    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!
}

标签: iosswiftobjectrealmnew-operator

解决方案


您需要正确设置类之间的关系。因此,尝试像这样替换您的类:

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)
}

推荐阅读