Realm Swift - 保存对另一个对象的引用

时间:2018-06-15 11:04:15

标签: ios swift realm

我认为在阅读herehere之后这会非常简单,但我有点卡住了。

我有一个'favouriteWorkout'对象,如下所示:

class FavouriteObject: Object {
    @objc dynamic var favouriteWorkoutName = ""
    @objc dynamic var workoutReference = WorkoutSessionObject()

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

我在这里尝试做的是在Realm中引用WorkoutSessionObject,当锻炼被保存为收藏时,它会从WorkoutName链接。

我的WorkoutSessionObject的主键为workoutID,这是一个UUID字符串。它看起来像这样:

class WorkoutSessionObject: Object {
    @objc dynamic var workoutID = UUID().uuidString
    @objc dynamic var workoutType = ""
    let exercises = List<WorkoutExercise>()
    @objc dynamic var totalExerciseCount = 0
    @objc dynamic var rounds = 0
    @objc dynamic var favourite : Bool = false

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

然后我尝试使用此保存:

let favouriteWorkout = FavouriteObject()
favouriteWorkout.favouriteWorkoutName = favouriteName
favouriteWorkout.workoutReference = (realm.object(ofType: WorkoutSessionObject.self, forPrimaryKey: self.workoutID))!

do {
    try realm.write {
        realm.add(favouriteWorkout)
    }
} catch {
    print ("Error adding favourite")
}

但是当我跑步时发生了崩溃:

  

'RLMException',原因:'FavouriteObject.workoutReference属性必须标记为可选。

但是,当我尝试将其设为可选(通过添加?)时,它会显示

  

“不能对'WorkoutSessionObject'类型的非可选值使用可选链接!

摘要

我想在workoutID中保存WorkoutSessionObject FavouriteObject的引用,这是WorkoutSessionObject的实际链接(因此可以从收藏)

更新

使用下面的答案我现在已经分类了锻炼参考的问题。现在,它在Realm中显示为“workoutReference”下的正确格式()。但是,在尝试保存时,我现在在“workoutReference”中获得“nil”。我知道,当我在控制台中打印它时,workoutID正确显示。

2 个答案:

答案 0 :(得分:2)

property-cheatsheet中,您可以看到不允许使用非可选Object - 属性,因此您必须按以下方式更改它:

class FavouriteObject: Object {
    @objc dynamic var favouriteWorkoutName = ""
    // here you have to make the property optional
    @objc dynamic var workoutReference: WorkoutSessionObject?

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

答案 1 :(得分:1)

您需要更改workoutReference的声明。首先,您需要在类型之后编写Optional来使其?。其次,您不应为其指定默认值,因此需要Optionallinked docs明确指出

  

一对一关系必须是可选的

workoutReference显然是一对一的关系。

class FavouriteObject: Object {
    @objc dynamic var favouriteWorkoutName = ""
    @objc dynamic var workoutReference:WorkoutSessionObject?

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