我有一个Realm数据库,其中的对象“事件”的属性名称为“ occasion”为字符串类型,属性名称“ venue”为字符串类型,另一个为Date()类型的“ date”。 我的问题是我们如何查询日期与今天(当天)相同的场合。我尝试使用以下代码使用日期过滤器来检索场合,它确实起作用:
let date = Date()
let dateFormatter = DateFormatter()
// dateFormatter.dateFormat = "dd/MM/yyyy"
dateFormatter.dateFormat = "d MMM yyyy"
let stringDate = dateFormatter.string(from: date)
todayEvent = realm.objects(Events.self).filter("date = '\(stringDate)'").sorted(byKeyPath: "venue", ascending: true)
即使以dd / MM / yyyy格式保存日期,Realm数据库中的日期也以“ 17 Jan 2019 at 12:00:00 AM”格式显示日期。我曾尝试更改日期格式,但仍然无法使用。还是我首先声明date属性时需要设置格式?如果是这样,我该如何在Realm类对象中执行此操作?我试过了,但是给了一个错误。我现在被困在这里。请帮助
这就是我将数据保存到Realm数据库的方式:
@IBAction func addNewEventButtonPressed(_ sender: UIButton) {
let newDataEntry = Events()
newDataEntry.occasion = occasionTextFile.text!
let dateString = dateTextField.text!
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"
let dateFromString = dateFormatter.date(from: dateString)
newDataEntry.date = dateFromString!
do {
try realm.write {
realm.add(newDataEntry)
}
} catch {
print("Error saving data \(error)")
}
}
答案 0 :(得分:0)
您正在使用具有时间和语言环境的Date
对象,因此仅与日期一起使用可以使用以下功能从日期对象中删除时间和语言环境:
func reomveTimeFrom(date: Date) -> Date {
let components = Calendar.current.dateComponents([.year, .month, .day], from: date)
let date = Calendar.current.date(from: components)
return date!
}
现在使用此功能获取确切的日期对象并从realm
数据库中获取数据。
let today = self.reomveTimeFrom(date: Date())
let predicate = NSPredicate(format: "date == %@",today as NSDate)
let results = realm.objects(Events.self).filter(predicate)
答案 1 :(得分:0)
根据Realm docs(强调我):
比较运算符==,<=,<,> =,>,!=和BETWEEN是 Int,Int8,Int16,Int32,Int64,Float,Double和 Date 支持 属性类型
因此,以下应该起作用:
let date = Date()
todayEvent = realm.objects(Events.self)
.filter("date == %@", date)
.sorted(byKeyPath: "venue") // sorted in ascending order by default
答案 2 :(得分:0)
问题是您要存储Date对象,但尝试将该属性过滤为字符串。
此行
let dateFromString = dateFormatter.date(from: dateString)
从字符串创建一个Date()对象,这就是存储在Realm属性中的内容。
一个Realm日期对象看起来像这样
2019-01-18T05:00:00.000Z
这是您的过滤器:
let stringDate = dateFormatter.string(from: date)
todayEvent = realm.objects(Events.self).filter("date = '\(stringDate)'")
这是从日期对象创建字符串,Realm将不知道如何处理它。如果要过滤date属性,请使用date对象进行过滤。
但重要的是-该行应因以下错误而崩溃
Expected object of type date for property 'date' on object of type 'Event', but received: 18 Jan 2019
解决方案是,如果您搜索的属性是Date,则过滤器需要是Date对象。
所以写一个以mm / dd / yyyy字符串开头的日期对象的例子
let aDateString = "01/20/2019"
let mmddyyyyFormatter = DateFormatter()
mmddyyyyFormatter.dateFormat = "MM/dd/yyyy"
if let dateObjectToStore = mmddyyyyFormatter.date(from: aDateString) {
newDataEntry.date = dateObjectToStore
} else {
print("could not create date object")
}
假设我们现在想找到带有“ yyyymmdd”字符串的对象
let dateStringToFind = "20190120"
let yyyymmddFormatter = DateFormatter()
yyyymmddFormatter.dateFormat = "yyyyMMdd"
let dateObjectToFind = yyyymmddFormatter.date(from: dateStringToFind)
let results = realm.objects(MyObject.self).filter("date == %@", dateObjectToFind)
if results.count > 0 {
for myObject in results {
print(myObject)
}
} else {
print("no objects have that date")
}
如您所见,我们将日期存储为日期对象,然后在过滤时为日期对象过滤。
有一些需要过滤的注意事项和一些例外,但您可以理解。