【问题标题】:Saving a Realm list made up of an array of struct objects保存由结构对象数组组成的领域列表
【发布时间】:2018-04-30 14:20:50
【问题描述】:

问题 我需要在领域中保存一个列表,该列表由结构对象数组的属性组成(已通过 Segue 并正在填充表格视图)。这是每行上的“练习名称”和“代表次数”的形式。

我尝试了什么? 我在字段和格式方面将领域对象与结构相匹配,并尝试将数组保存为列表,例如"=List" 但这不起作用(“使用未声明的类型”)。我还尝试了各种方法来尝试保存每个表格行的属性,但同样无法正常工作(例如 = cell.workoutname)

研究我发现了这个How to save a struct to realm in swift? 但是,这不是为了保存我不认为的对象数组。但是,这 确实(第一个答案)让我想到了将每行中包含的值保存到 Realm 而不是实际的 Struct 数组的想法。我还发现了这个Saving Array to Realm in Swift?,但我认为这是针对数组已经由领域对象组成的,而不是像我这样的结构实例。

代码和详细信息

结构

我有一个如下所示的结构。另一个结构 (Workout Generator) 具有生成 x 个这些对象实例的函数。然后这些通过 Segue 传递到新的 VC TableView(每行显示一个锻炼名称和代表次数):

struct WorkoutExercise : Hashable, Equatable{

    let name : String
    let reps : Int
    var hashValue: Int {
        return name.hashValue
    }

    static func == (lhs: WorkoutExercise, rhs: WorkoutExercise) -> Bool {
        return lhs.name == rhs.name
    }


}

然后我有以下领域对象。一种是保存“WorkoutSession”。这将包含 WorkoutExercise 领域对象的领域列表。

class WorkoutSessionObject: Object {
    @objc dynamic var workoutID = UUID().uuidString
    @objc dynamic var workoutName = ""
    let exercises = List<WorkoutExerciseObject>()
    var totalExerciseCount: Int {
        return exercises.count
    }
}

class WorkoutExerciseObject: Object {
    @objc dynamic var name = ""
    @objc dynamic var reps = 0
}

我在尝试将锻炼详细信息保存到 Realm 时尝试了以下代码:

func saveToRealm() {
        let workoutData = WorkoutSessionObject()
        workoutData.workoutName = "test"
        workoutData.workoutID = UUID().uuidString
        workoutData.exercises = List<selectedWorkoutExerciseArray>
    }

认为阅读其他答案后我需要做什么

选项 1 - 不是尝试保存实际数组,而是保存每个表格行中的“名称”和“代表”?

选项 2 - 以某种方式将“selectedWorkoutExerciseArray”转换为领域对象列表?

当然可能还有其他选择!任何帮助/想法表示赞赏!

【问题讨论】:

  • 为什么你同时拥有 WorkoutExerciseObject 和结构 WorkoutExercise ?如果合并它们有​​意义,那么您可以直接操作 Object 的数组。
  • 将结构转换为领域对象似乎需要做很多工作。为什么不只使用类?您不需要创建单独的对象等。
  • 当我切换到一个类时,我的生成锻炼的函数会出现“名称、代表、不匹配任何可用的重载”的错误 - 使用类而不是结构?
  • 嗯,你已经有一个 WorkoutExerciseObject 是一个类,所以不知道为什么你有这个结构。我认为你把它弄得太复杂了。您可以像使用代码中的任何对象一样使用 Realm 对象。当您可以修改您的领域对象以包含您需要的所有字段和方法时,没有理由存在类似的对象。

标签: ios swift realm swift4


【解决方案1】:

如果仍然需要持久化,为什么要填充 2 个单独的列表?只需使用 Realm 中的列表来填充您的表格视图。这是一个使用 append 填充列表的简单示例(就像任何数组一样):

class SomeClass: Object {
    @objc dynamic var id: String = ""
    var someList = List<SomeOtherClass>()

    convenience init(id: String) {
        self.init()

        self.id = id
    }
}

@objcMembers class SomeOtherClass: Object {
    dynamic var someValue: String = ""

    convenience init(value: String) {
        self.init()

        someValue = value
    }
}

func addToList(someOtherClass: SomeOtherClass) {

    let realm = try! Realm()

    if let someClass = realm.objects(SomeClass.self).last {

        do {
            try realm.write({
                someClass.someList.append(someOtherClass)
            })
        } catch {
            print("something went wrong")
        }
    }
}

【讨论】:

  • 我现在在我的函数中使用一个类而不是一个结构(并且已经删除了结构),这很好用,谢谢:-)
【解决方案2】:

我有一个非常相似的功能,允许用户从表格视图中进行选择。我所做的是从选择中创建一个列表,例如:

var arrayForSelectedObjects = [CustomObject]()
...

let aList = List<CustomObject>()
aList.append(objectsIn: arrayForSelectedObjects)

//I then assign the created list to the main object and save it.
let realmObject = MainObject()
realmObject.list = aList

我的 CustomObject 也存储在领域数据库中。

我的 MainObject 是这样定义的:

class MainObject : Object {
    @objc dynamic var title: String?

    var list = List<CustomObject>()
}

【讨论】:

  • 当我尝试这个时,我得到'使用未声明的类型' - 我认为这可能是因为我使用的是结构,而您使用的是 2 个领域对象类?
  • @nc14 我正在使用类,但如果我理解正确,您也在保存类class WorkoutSessionObject: Objectclass WorkoutExerciseObject: Object。您如何创建练习列表?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多