【问题标题】:Store values in realm在领域中存储值
【发布时间】:2019-11-23 00:07:21
【问题描述】:

我正在创建一个健身日志应用程序,并将锻炼值存储在以下领域:

我正在使用日期对锻炼进行排序。我想完成一些新的事情,我可以在同一个练习中每组有不同的重量和次数。它基于这样的设计:

我认为数据库必须像这样,但不确定:

  • 23.11.2019
    • 杠铃卧推
      • 设置 1
        • 公斤:90
        • 重复次数:5
      • 设置 2
        • 公斤:87.5
        • 重复次数:6
    • 三头肌下推
      • 设置 1
        • 公斤:110
        • 重复次数:6
      • 设置 2
        • 公斤:110
        • 重复次数:6
      • 设置 3
        • 公斤:112.5
        • 重复次数:5

关于如何做到这一点的任何提示?

编辑; 这是我目前的Workout.swift 课程(不知道如何编辑它以获得我想要的):

import Foundation
import RealmSwift

class Workout: Object {

    @objc dynamic var date: Date?
    @objc dynamic var name: String?
    @objc dynamic var exercise: String?
    @objc dynamic var sets = 0
    @objc dynamic var reps = 0
    @objc dynamic var kg: Double = 0.0
    @objc dynamic var notes: String?

}

【问题讨论】:

  • @Sammy 现在更新了课堂问题:)
  • 这个问题有点含糊。我看到您对(不正确)答案的评论,但仍不清楚。您是说您的 sets var 实际上应该是步骤的List(提示提示)吗?所以集合列表将包含具有三个属性的对象;一个索引,num_reps 和权重?索引将是步骤 # 的位置;索引 0 = 步骤 0,索引 1 = 步骤 1,每个步骤都有相关的代表次数和该步骤的重量
  • @Jay 问题是我不确定我应该如何设置它。试图按照我想要的方式创建它; ibb.co/rw9x8BK - 希望有帮助。
  • @rs7 有一个很好的答案,并根据我的评论提供了一个清晰的例子。

标签: ios swift xcode realm


【解决方案1】:

您需要拥有三个对象(锻炼、锻炼和设置)并具有文档中所述的 2 个多对多关系:https://realm.io/docs/swift/latest/#many-to-many

class Workout: Object {

    @objc dynamic var date: Date?
    // List of exercises (to-many relationship)
    var exercises = List<Exercise>()

}

.

class Exercise: Object {

    @objc dynamic var name: String?
    // List of sets (to-many relationship)
    var sets = List<Set>()
    var parentWorkout = LinkingObjects(fromType: Workout.self, property: "exercises")
}

.

class Set: Object {

    @objc dynamic var reps: Int = 0
    @objc dynamic var kg: Double = 0.0
    @objc dynamic var notes: String?
    // Define an inverse relationship to be able to access your parent workout for a particular set (if needed)
    var parentExercise = LinkingObjects(fromType: Exercise.self, property: "sets")

    convenience init(numReps: Int, weight: Double, aNote: String) {
       self.init()
       self.reps = numReps
       self.kg = weight
       self.notes = aNote
    }

}

编辑

添加示例代码

let aSet0 = Set(numReps: 10, weight: 5.0, aNote: "light workout")
let aSet1 = Set(numReps: 10, weight: 20.0, aNote: "medium workout")
let aSet2 = Set(numReps: 10, weight: 30.0, aNote: "heavy workout")

let aWorkout = Workout()
aWorkout.name = example
aWorkout.sets.append(objectsIn: [aSet0, aSet1, aSet2] )

另一个显示“卧推”训练组的示例代码:

// Find the Workout instance "Bench Press"
let benchPressWorkout = realm.objects(Workout.self).filter("name = 'Bench Press'")
// Access the sets for that instance
let sets = benchPressWorkout.sets
// Access set[0]
let set0 = sets[0]
// Access reps and kg for set 0
let reps0 = set0.reps
let kg0 = set0.kg
// and so on ...

【讨论】:

  • 根据我对问题的评论,这是一个很好的解决方案。反向关系是一个很好的补充,因为您可能想知道在某些时候哪些锻炼使用 > 50Kg 的组数。您还可以将这些套装标记为“初学者套装”或“高强度锻炼套装”,以使其可重复使用。
  • @Jay - 我是新手,但我正在这里做些什么?尝试保存练习:ibb.co/6gfqqnK
  • @rs7 很好的答案。我添加了一个代码示例来说明使用。随意编辑。
  • @Camile 不确定这是否正确。我更新了这个答案一些示例代码,以便您了解如何实现它。
  • @Jay 好的,很好!我现在设法存钱上班。所以现在 Realm Studio 中的类看起来像这样:ibb.co/NNRsgr2。但是从运动到reps/kg的次数没有联系,所以我不能显示什么运动有什么数据?那么我/用户如何知道什么运动有 10 次重复,5kg 和 aNote;轻度锻炼?
【解决方案2】:

以这种方式创建锻炼

let realm = try! Realm()
var wo = WorkOut()//Do initialization for properties such as name,reps,...
try! realm.write{
   realm.add(wo)
}

WorkOut 的一条记录已写入您的数据库

【讨论】:

  • 谢谢,但我认为您误解了我的问题。我已经知道如何保存到领域,因为我已经在使用我在第一张图片中提供的数据库。目前,它保存的锻炼是这样的:卧推,3组,5次,80公斤。但我想将其更改为:卧推;第一组,5 次 75 公斤,第二组,4 次 77.5 公斤,第三组,3 次 80 公斤。
  • 我想创建一个看起来像这样的领域数据库:ibb.co/rw9x8BK
  • 它在哪里崩溃,你得到了什么错误?从技术上讲,您需要为这样的新问题打开一个新线程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
相关资源
最近更新 更多