Как запросить свойство даты в Realm? - PullRequest
0 голосов
/ 17 января 2019

У меня есть база данных Realm с объектом «События» с именем свойства «случай» типа строка, именем свойства «место действия» типа строка, а другая - «дата» типа 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)

Дата в базе данных Realm показывает дату в этом формате «17 января 2019 года в 12:00:00 AM», даже если дата была сохранена в формате дд / мм / гггг. Я пытался изменить формат даты, но все равно это не сработает. Или мне нужно установить формат для свойства даты, когда я объявляю его в первую очередь? Если так, то как мне сделать это в объекте класса 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 голосов
/ 17 января 2019

Согласно Документам Царства (выделено мое):

Операторы сравнения ==, <=, <,> =,>,! = И МЕЖДУ поддерживается для Int, Int8, Int16, Int32, Int64, Float, Double и Дата типы недвижимости

Таким образом, должно работать следующее:

let date = Date()
todayEvent = realm.objects(Events.self)
    .filter("date == %@", date)
    .sorted(byKeyPath: "venue") // sorted in ascending order by default
0 голосов
/ 19 января 2019

Проблема в том, что вы храните объекты 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 не будет знать, что с ним делать. Если вы хотите отфильтровать свойство даты, используйте для этого объект даты.

Важно то, что эта строка должна аварийно завершиться со следующей ошибкой

Expected object of type date for property 'date' on object of type 'Event', but received: 18 Jan 2019

Решение состоит в том, что если свойство, по которому вы ищете, является датой, тогда фильтр должен быть объектом даты.

Итак, пример написания объекта даты, который начинается как строка мм / дд / гггг

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

Предположим, что теперь мы хотим найти этот объект со строкой "ггггммдд"

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

Как видите, мы сохранили дату как объект даты, а затем при фильтрации отфильтровали по объекту даты.

Есть несколько предостережений при фильтрации и некоторые исключения, но вы получите общее представление.

0 голосов
/ 17 января 2019

Вы используете 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)

Полный исходный код на github

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...