Сохранение в CoreData

swift
ios
coredata

#1

Добрый день.
Как упростить процесс сохранения объекта класса в CoreData?

Допустим есть класс

Car {
   let name = ""
}

Есть модель данных Car с атрибутом name типа String.

На данный момент сохраняю таким образом:

  let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
  let managedContext = appDelegate.managedObjectContext
  let newCar = NSEntityDescription.insertNewObjectForEntityForName("Car", inManagedObjectContext: managedContext) as NSManagedObject
  newCar.setValue(car.name, forKey: "name")
  do {
    try managedContext.save()
  } catch {
    
  }

Если у меня будет 20 свойств у класса Car мне 20 раз придется вызывать метод newCar.setValue()

Нет ли возможности как-то контексту передавать объект класса целиком, а не каждое свойство отдельно?


#2

Можно создать подкласс NSManagedObject


#3

Упростить процесс можно используя Realm https://realm.io, я лично через 20 минут разобрался и не нарадуюсь)


#4

Ещё один вопрос.
Сохраняю в CoreData таким образом:

  let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
  let managedContext = appDelegate.managedObjectContext
  let newCar = NSEntityDescription.insertNewObjectForEntityForName("Car", inManagedObjectContext: managedContext) as NSManagedObject
  newCar.setValue(car.name, forKey: "name")
  do {
    try managedContext.save()
  } catch {
    
  }

Количество объектов увеличивается на 1, однако все имею атрибут name как у последнего созданного объекта. Пример:
Был один объект с именем Car1. При добавлении ещё одного объекта с именем Car2, имеем 2 объекта Car2 и Car2. При создании ещё одного объекта Car3, имеем три объекта Car3 Car3 Car3. Где мог ошибиться?


#5

Очень странно :thinking: Попробуйте такую конструкцию:

for i in 0..<5 {
    let entity = NSEntityDescription.insertNewObjectForEntityForName("Car", inManagedObjectContext: managedObjectContext)
    entity.setValue("car\(i)", forKey: "name")
}
        
if (try? managedObjectContext.save()) != nil {
    let fetchRequest = NSFetchRequest()
    fetchRequest.entity = NSEntityDescription.entityForName("Car", inManagedObjectContext: managedObjectContext)
            
    if let objects = try? managedObjectContext.executeFetchRequest(fetchRequest) {
          for object in objects {
              print(object.valueForKey("name"))
          }
    }
}

#6

Добрый день! подскажите из ответ из курса - toDoList - как сделать чтоб тип Task высвечивался как метод? Entity - под названием Task. Сделал все как в видеокурсе, но компилятор не воспринимает тип Task. скриншот во вложении.


#7

Привет! У тебя структура Task есть вообще?


#8

а какая струтура должна быть для Task?он указала свойство для - Task - Class - CodeGen - Class Defifnition. Исходя из этого эти структуры должны сами создаваться, а без них никак. Поставил Мануал и создал сам … ниже пост … и запустилось


#9

только если их прописать в NSManagedObjects


#10

У тебя xCode дальше расширение сгенерил. Properties.
Там остальные свойства будут.


#11

Это понятно что создается, но как-то не сразу схватывается.
Сейчас второй вопрос, проект MyCar - на видео Иван создает классы для Entity через Editor - Crearte NSManagedObjectSubclass - создается на видео 2 файла с расширением swift, а в проекте - создаются файлы на языке ObjC - 2 header и 2 .m ?
Как изменить , чтоб создавались swift файлы?


#12

вопрос решен - вот этим


#13

Я предположу: 1) надо было проект изначально на свифте создавать 2) при генерации где-то галочку надо поставить с нужным языком. Ну и 3) просмотреть как эта кордата работает в теории и перейти на realm :slight_smile: