Основные данные. Фильтровать по дате - PullRequest
0 голосов
/ 12 марта 2020

У меня есть .xcdatamodel в базовых данных с содержимым сущности и типом атрибутов dateCreated Date и text1 Type String.

//CREATE
   func createData() {
       guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
       let managedContext = appDelegate.persistentContainer.viewContext
       let contentEntity = NSEntityDescription.entity(forEntityName: "Content", in: managedContext)!

       let content = NSManagedObject(entity: contentEntity, insertInto: managedContext)
       content.setValue(Date(), forKey: "dateCreated")
       content.setValue("someText", forKey: "text1")

       do {
           try managedContext.save()
       } catch let error as NSError {
           print("Could not save. \(error), \(error.userInfo)")
       }
    }

//READ
    func readData() {
           guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
           let managedContext = appDelegate.persistentContainer.viewContext
           let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Content")
           fetchRequest.predicate = NSPredicate(format: "text1 = %@", "some text")

           do {
               let result = try managedContext.fetch(fetchRequest)

               for data in result as! [NSManagedObject] {
                   print(data.value(forKey: "dateCreated") as! Date)
                   print(data.value(forKey: "text1") as! String)
               }
           } catch {
               print("Failed")
           }
       }

если я печатаю dateCreated, это дает: 2020-03-12 10:20:42 +0000 Мой вопрос: как я могу читать и фильтровать по дате? Только дата, а не время. Например, 2020-03-12 или любая другая дата без времени:

fetchRequest.predicate = NSPredicate(format: "dateCreated = %@", ?????)

1 Ответ

0 голосов
/ 12 марта 2020

В CreateData () вы сохраняете дату, используя Date () . Так что он будет храниться в вашей базе данных в формате гггг-мм-дд чч: мм: сс ZZZZ . Вот почему он печатает это 2020-03-12 10:20:42 + 0000

Изменить с

fetchRequest.predicate = NSPredicate(format: "text1 = %@", "some text")

на

fetchRequest.predicate = NSPredicate(format: "dateCreated = %@", Date())

если вы используете этот предикат вместо text1, основные данные будут давать вам результат с датой, и будет трудно фильтровать, если есть время. Поэтому вам нужно вставить дату, изменив ее формат на гггг-мм-дд

Вы можете изменить текущий формат даты, используя DateFormatter () .

//Needed date format
let dateFormat = DateFormatter()
dateFormat.dateFormat = "yyyy-MM-dd"
let formattedDate = dateFormat.string(from: Date())

Поэтому попробуйте вставить Date (), изменив его формат

//in CreateData()
content.setValue(formattedDate, forKey: "dateCreated")

//in ReadData()
fetchRequest.predicate = NSPredicate(format: "dateCreated = %@", formattedDate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...