如何在Realm中查询日期属性?

时间:2019-01-17 07:20:09

标签: ios swift realm

我有一个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)")
    }


}

3 个答案:

答案 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)

完成source code on github

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

如您所见,我们将日期存储为日期对象,然后在过滤时为日期对象过滤。

有一些需要过滤的注意事项和一些例外,但您可以理解。