【问题标题】:Check if Realm data has been added on a specific date检查是否在特定日期添加了领域数据
【发布时间】:2019-12-07 18:56:54
【问题描述】:

如果在特定日期注册了任何锻炼,我正在尝试创建查找。

Object 类如下所示:

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

在Realm中,我可以看到有一个注册日期为2019-12-07 19:48:35 +0000;。所以我在我的viewDidLoad 中添加了一张支票,如下所示:

let nowDate = Date()
func checkIfWorkoutHasBeenRegistered() {// Check if there already exist a workout today
        let realm = try! Realm()

        let todaysWorkouts = realm.objects(Workout.self).filter("date = %@", nowDate)
        if todaysWorkouts.isEmpty {
            print("No workout found")
        } else {
            print("Workout has been created")
        }
    }

但它给了我输出No workout found,即使我今天已经注册了锻炼。有什么建议吗?

【问题讨论】:

    标签: ios swift xcode realm


    【解决方案1】:

    使用您当前的谓词,您将保存日期和时间与当前日期和时间进行比较,这肯定会有所不同,因为即使只有几分之一秒的差异也会使它们不相等。相反,您可能想查看保存的日期是否在某个范围内。例如,如果您想查看“今天”出现的所有具有date 的对象,您可以创建如下谓词:

    let startOfDay = Calendar.current.startOfDay(for: Date())
    let endOfDay = Calendar.current.date(byAdding: .day, value: 1, to: startOfDay) ?? Date()
    
    let predicate = NSPredicate(format: "date >= %@ && date < %@", startOfDay as NSDate, endOfDay as NSDate)
    let todaysWorkouts =  realm.objects(Workout.self).filter(predicate)
    

    【讨论】:

    • 如果已经创建了锻炼,我如何在不创建全新锻炼的情况下向该锻炼添加新锻炼?
    • 您可以将Exercise 附加到Workoutexercises: List&lt;Exercise&gt;
    【解决方案2】:

    这可能适用也可能不适用,但使用纯形式的 Date 对象会有些复杂。

    例如,如您的问题所示,如果您想在 2019 年 9 月 12 日进行锻炼怎么办?或者,在某个日期进行所有锻炼。如果您为要过滤的日期生成日期对象,像这样

    var dateComps = DateComponents()
    dateComps.day = 08
    dateComps.month = 12
    dateComps.year = 2019
    let cal = Calendar.current
    let theDate = cal.date(from: dateComps)
    

    还有一个时间组件需要考虑,所以这个查询将不起作用

    let workoutResults = realm.objects(Workout.self).filter("timestamp == %d", theDate)
    

    因为Realm中存储的日期对象就是这个

    2019-12-08T15:32:40
    

    您的查询就是针对这个

    2019-12-08T05:00:00
    

    请注意,即使 DAY 相同,TIME 也不同,因此不匹配。您可以为上午 12 点到晚上 11:59 之间的任何结果制作范围过滤器,但同样可能过于复杂。

    这取决于您是否需要日期的时间部分。如果没有,这个模型怎么样

    class Workout: Object {
        @objc dynamic var workout_id = UUID().uuidString
    
        @objc dynamic var date_stamp: String?
        @objc dynamic var workout_name: String?
        @objc dynamic var timestamp: Date?
    
        convenience init(withName: String) {
            self.init()
            let date = Date()
            let formatter = DateFormatter()
            formatter.dateFormat = "yyyyMMdd"
            let result = formatter.string(from: date)
    
            self.date_stamp = result
            self.workout_name = withName
            self.timestamp = date
        }
    
        var exercises = List<Exercise>()
    
        override static func primaryKey() -> String? {
            return "workout_id"
        }
    }
    

    您可以充分利用这两者,因为您的锻炼现在有一个名称、一个可搜索和可排序的日期字符串以及一个实际时间戳(如果需要)。

    name: "Monday Workout"
    date_stamp: "20191208"
    timestamp: 2019-12-08T15:32:40
    

    因此特定日期的过滤器变为

    let workoutResults = realm.objects(Workout.self).filter("date_stamp == '20191208'")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      相关资源
      最近更新 更多