【问题标题】:Realm Swift - save a reference to another objectRealm Swift - 保存对另一个对象的引用
【发布时间】:2018-11-25 05:20:36
【问题描述】:

在阅读 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”类型的非可选值使用可选链接!

总结

我想在我的FavouriteObject 中保存对WorkoutSessionObjectworkoutID 的引用,这是到WorkoutSessionObject 的实际链接(因此可以从收藏夹中访问属性)

更新

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

【问题讨论】:

    标签: ios swift realm


    【解决方案1】:

    property-cheatsheet 中你可以看到一个非可选的Object-property 是不允许的,所以你必须像下面这样改变它:

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

    【讨论】:

      【解决方案2】:

      您需要更改workoutReference 的声明。首先,您需要通过在 type 之后写入 ? 来使其成为 Optional。其次,您不应该为其分配默认值,它必须是 Optional 是有原因的。 linked docs 明确指出

      一对一的关系必须是可选的

      workoutReference 显然是一对一的关系。

      class FavouriteObject: Object {
          @objc dynamic var favouriteWorkoutName = ""
          @objc dynamic var workoutReference:WorkoutSessionObject?
      
          override class func primaryKey() -> String? {
              return "favouriteWorkoutName"
          }
      }
      

      【讨论】:

      • 感谢它现在有效,并且数据库中的引用现在是正确的 - 我在尝试保存时得到“nil”......我的保存功能也错了吗?
      • @nc14 你得到的是nil 还是FavouriteObjectworkoutReference?你到底从哪里得到这个nil
      • @nc14 请编辑您的问题以包含workoutReferencenil 的代码。
      • 对不起,这可能不是你的意思,但我的“保存”块在“我已经尝试用这个保存:”下的问题中:
      • @nc14 我明白了,但是在您的“保存块”中,workoutReference 不可能成为nil,因为您为其分配了一个非可选值。您是否尝试在写入事务后从 Realm 检索 FavouriteObject,而这就是 workoutReference 为零的地方?如果是这种情况,请edit您的问题包含更新的代码并显示问题所在。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多