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'")
如果已创建训练,我如何向该训练添加新的训练,而不创建全新的训练?您可以将
训练
附加到训练
的训练:列表
如果已创建训练,我如何向该训练添加新的训练,不创建全新的训练?您可以将练习
附加到训练
的练习:列表