Курс 2 урок 43 Сохранение рейтинга в core дата

coredata

#1

Столкнулся с проблемой “домашнего задания”.
Задача в уроке: сохранить рейтинг ресторана в core data и соответственно оттуда брать инфу для вызова.
Для полей названия, тип ресторана делалось по уроку так:

    // tring to get context
  if let context = (UIApplication.shared.delegate as? AppDelegate)?.coreDataStack.persistentContainer.viewContext {
    // create entity of our restaurant class in the context
    let restaurant = Restaurant(context: context)
    // set all the properties
    restaurant.name = nameTextField.text
    restaurant.location = adressTextField.text
    restaurant.type = typeTextField.text
    restaurant.isVisited = isVisited
    if let image = imageView.image {
      // as we expect to get binary data so we cast to NSData
      restaurant.image = UIImagePNGRepresentation(image) as NSData?
    }
    // trying save context
    do {
      try context.save()
      print("Сохранение удалось!")
    } catch let error as NSError {
      print("Не удалось сохранить данные \(error), \(error.userInfo)")
    }
  }

Соответственно, я аналогично решил попробовать и для рейтинга:

@IBAction func rateRestaurant(sender: UIButton) {
    switch sender.tag {
    case 0: 

restRating = “bad”
// tring to get context
if let context = (UIApplication.shared.delegate as? AppDelegate)?.coreDataStack.persistentContainer.viewContext {
// create entity of our restaurant class in the context
let restaurant = Restaurant(context: context)
// set all the properties
restaurant.rating = restRating
}
// trying save context
do {
try context.save()
print(“Сохранение удалось!”)
} catch let error as NSError {
print(“Не удалось сохранить данные (error), (error.userInfo)”)
}
case 1: restRating = "good"
case 2: restRating = "brilliant"
default: break
}
performSegue(withIdentifier: “unwindSegueToDVC”, sender: sender)

}

Перепробовал в итоге кучу вариантов “как мне казалось правильно”, но по итогу всегда одна и та же ошибка уже при выводе в tableview списка ресторанов (после нажатия на кнопку рейтинга):
fatal error: unexpectedly found nil while unwrapping an Optional value

Опять-таки как я понимаю, что своими действиями я затираю (удаляю) сохраненную информацию с названиями ресторанов и т.п.
Явно в моих “видениях” нарушена логина и делаю в в принципе не верно, поэтому и обращаюсь к вам. Как мне сохранить рейтинг и вывести его…?
Вот оригинальный проект из урока для наглядности:
https://yadi.sk/d/dtjF9cQ_39w2Kn


#2

Я как-то не так спросил? Вроде вопрос для знающих не сложен должен быть…


#3

Что-то получилось сделать…
Посмотрите, пожалуйта, вроде получилось и что-то сделал.
Вопрос, restaurant.rating сохраняется в базу данных (через core data)?
Проверьте, пожалуйста.
https://yadi.sk/d/XxVQHbfO3AAhDR

PS Похоже, что нет, так как поле перезагрузки симулятора значения рейтинга сбрасываются
Кажется я понял где я обнуляю (очищаю) все свойства restaurant.* - при создании экземпляра класса (второй раз получается, первый раз создаю когда помещаю name, type и прочее).
Получается что-то другое писать надо?

    //добираемся до Context (всегда и регулярно так будет)
    if let context = (UIApplication.shared.delegate as? AppDelegate)?.coreDataStack.persistentContainer.viewContext {
        //создаем экземпляр класса в контекте
        **let restaurant = Restaurant(context: context)**
        print("хератель какая-то \(restaurant.name)")
        // устанавливаем значение для его свойст
        restaurant.rating = restRating
        //сохраняем сам контект
        do {
            try context.save()
            print("сохранение удалось")
        } catch let error as NSError {
            print ("Не удалось сохранить данные \(error), \(error.userInfo)")
        }
    }

#4

Не понимаю почему никто не ответил и не написал на ошибку.
Ошибка была в строке:
let restaurant = Restaurant(context: context) - я создавал сущность вместо того чтобы использовать ранее созданную…

@IBAction func unwindSegue (segue: UIStoryboardSegue) {
    //сюда передали из rateviewcontroller
    guard let svc = segue.source as? rateViewController else {return}
    guard let rating = svc.restRating else {return}
    
    //Начало.сохраняем все данные на постоянку
    //добираемся до Context.
    if let context = (UIApplication.shared.delegate as? AppDelegate)?.coreDataStack.persistentContainer.viewContext {
        //let restaurant = Restaurant(context: context)
        restaurant?.rating = rating
        //сохраняем сам контект
        do {
            try context.save()
            print("сохранение удалось")
        } catch let error as NSError {
            print ("Не удалось сохранить данные \(error), \(error.userInfo)")
        }
    }

#5

Не совсем понимаю, что я сделал не так, выскакивает ошибка на стадии симуляции.

https://yadi.sk/d/Cpxx1YOm3NmFE5