Ios 检查是否在特定日期添加了领域数据

Ios 检查是否在特定日期添加了领域数据,ios,swift,xcode,realm,Ios,Swift,Xcode,Realm,我正在尝试创建一个查找,如果在特定日期注册了任何训练 对象类如下所示: class Workout: Object { @objc dynamic var date: Date? // List of exercises (to-many relationship) var exercises = List<Exercise>() } let nowDate = Date() func checkIfWorkoutHasBeenRegistered()

我正在尝试创建一个查找,如果在特定日期注册了任何训练

对象类如下所示:

class Workout: Object {

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

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

但它给了我输出
未找到任何训练
,即使我今天已经注册了训练。有什么提示吗?

使用当前谓词,您将保存日期和时间与当前日期和时间进行比较,而当前日期和时间肯定会有所不同,因为即使是很小的差异也会使它们不相等。相反,您可能希望查看保存的日期是否在某个范围内。例如,如果您想查看所有具有发生在“今天”的
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)
让startOfDay=Calendar.current.startOfDay(for:Date())
让endOfDay=Calendar.current.date(通过添加:.day,值:1,到:startOfDay)??日期(
let predicate=NSPredicate(格式:“日期>=%@&&date<%@”,开始日期为NSDate,结束日期为NSDate)
让todaysWorkouts=realm.objects(Workout.self).filter(谓词)

使用当前谓词,您将保存日期和时间与当前日期和时间进行比较,而当前日期和时间肯定会有所不同,因为即使是很小的差异也会使它们不相等。相反,您可能希望查看保存的日期是否在某个范围内。例如,如果您想查看所有具有发生在“今天”的
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)
让startOfDay=Calendar.current.startOfDay(for:Date())
让endOfDay=Calendar.current.date(通过添加:.day,值:1,到:startOfDay)??日期(
let predicate=NSPredicate(格式:“日期>=%@&&date<%@”,开始日期为NSDate,结束日期为NSDate)
让todaysWorkouts=realm.objects(Workout.self).filter(谓词)

这可能适用,也可能不适用,但使用纯格式的日期对象有一定的复杂性

例如,如您的问题所示,如果您想在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)
因为存储在领域中的日期对象是

2019-12-08T15:32:40
你的问题就是为了这个

2019-12-08T05:00:00
请注意,即使是同一天,时间也不同,因此没有匹配项。您可以为上午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"
    }
}
因此,特定日期的过滤器变为

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

这可能适用,也可能不适用,但在处理纯形式的日期对象时存在一些复杂性

例如,如您的问题所示,如果您想在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)
因为存储在领域中的日期对象是

2019-12-08T15:32:40
你的问题就是为了这个

2019-12-08T05:00:00
请注意,即使是同一天,时间也不同,因此没有匹配项。您可以为上午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"
    }
}
因此,特定日期的过滤器变为

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

如果已创建训练,我如何向该训练添加新的训练,而不创建全新的训练?您可以将
训练
附加到
训练
训练:列表
如果已创建训练,我如何向该训练添加新的训练,不创建全新的训练?您可以将
练习
附加到
训练
练习:列表