Как вставить новые данные в сущность в Swift3?

В Swift ранее я мог использовать подобный код, чтобы добавить новые данные в мой «TestEntity» в моей модели данных.

NSManagedObject был создан для моего "TestEntity", и я смог установить его атрибуты с синтаксисом "точка"

В конце я бы сохранил контекст

let entity=NSEntityDescription.insertNewObject(forEntityName: "TestEntity", into: context) as! TestEntity
entity.testAttribute="test value"
context.save()

Этот код не работает в Swift3. Когда я запускаю его, я получаю следующую ошибку во время выполнения:

Не удалось преобразовать значение типа «NSManagedObject_TestEntity_» (0x175306b0) в «testCoreData.TestEntity» (0xd6bb8). 2016-06-19 11: 07: 52.305195 testCoreData [689: 264453] Не удалось привести значение типа 'NSManagedObject_TestEntity_' (0x175306b0) к 'testCoreData.TestEntity' (0xd6bb8)

Может кто-нибудь пролить свет на то, как это должно быть сделано в swift3, пожалуйста? Любая помощь высоко ценится. Спасибо.

Вторая часть вопроса - как снова получить доступ к данным. следующий код заканчивается ошибкой: фатальная ошибка:NSArray элемент не соответствует типу элемента Swift Array

let fr:NSFetchRequest<TestEntity>=TestEntity.fetchRequest()

do {
   let searchResults=try context.fetch(fr)
   if let results=searchResults {
      for result in results {
         print("testAtt = \(result.testAtt)")
      }
   }
} catch {

}

Ответы на вопрос(4)

рабочий пример:

    let fr:NSFetchRequest<TestEntity>=TestEntity.fetchRequest()
    do {
        let results=try self.moc!.fetch(fr)
        if results.count==0 {
            print("no resutls. i need to add something")
            let newTestEntity=TestEntity(context: self.moc!)
            newTestEntity.testAtt="testovaci text"
            do {
                try self.moc!.save()
            }catch{

            }
        }else{
            print("already some results")
            for result in results {
                print(result.testAtt!)
            }
        }
    }catch {
        print(error)
    }

Инспектор модели данных Имя класса TestEntity должно быть установлено в TestEntity. Предыдущее странное поведение, казалось, было вызвано тем, что это значение было пустым.

но API предлагает 3 различных способа созданияNSManagedObject пример. Я не знаю, если один из них предлагает какую-либо выгоду по сравнению с другим.

Предполагая, что у вас есть подкласс сущности / NSManagedObjectTestEntity тогда все перечисленное ниже одинаково:

Новый способ (не требуется литье)+iOS10:

let test = TestEntity(context: context)
test.attribute1 = "a value"

Старые способы (приведение не требуется, если вы согласны с использованиемsetValue, С кастингом вы можете использовать точечную запись.+iOS3

let testEntity =  NSEntityDescription.entity(forEntityName: "TestEntity", in: context)

let test1 = NSManagedObject(entity: testEntity!, insertInto: context)
test1.setValue("a value", forKey: "attribute1")

let test2 = NSManagedObject(entity: testEntity!, insertInto: context) as! TestEntity
test2.attribute1 = "a value"

или же:

let test1 = NSEntityDescription.insertNewObject(forEntityName: "TestEntity", into: context)
test1.setValue("a value", forKey: "attribute1") 

let test2 = NSEntityDescription.insertNewObject(forEntityName: "TestEntity", into: context) as! TestEntity
test2.attribute1 = "a value"

как только вы создадите экземпляр NSManagedObject и назначите его атрибуты, вы просто сохраните его в контексте.

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

}

Если естьNSManagedObject подклассTestEntity новый синтаксис

let entity = TestEntity(context: context)
entity.testAttribute="test value"
 vadian21 июн. 2016 г., 13:38
В Swift 3 произошли фундаментальные изменения в отношении базовых данных. Например, есть новый классNSPersistentContainer управлять созданием стека основных данных. Создайте новый проект с включенными Core Data, чтобы увидеть изменения.
 vadian19 июн. 2016 г., 22:16
@Mundi Да, конечно, но это не имеет значения для вопроса. Я удалил строку.
 matyasl21 июн. 2016 г., 13:33
Я должен был создать NSEntityDescription для приведенного выше кода для работы. без него я получил еще одну ошибку времени выполнения: завершение приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «NSManagedObject класса« testCoreData.TestEntity »должен иметь действительную NSEntityDescription.»let entityDes=NSEntityDescription.entity(forEntityName: "TestEntity", in: context) let entity=TestEntity(entity: entityDes!, insertInto: context) entity.testAtt="test attribute" Но тогда это сработало. Спасибо.
 Mundi19 июн. 2016 г., 22:12
Сохранение должно быть вtry-catch блоки.
//retrieve the entity
let entity =  NSEntityDescription.entity(forEntityName: "TestEntity", in: context)

let testEntity = NSManagedObject(entity: entity!, insertInto: context)

//set the entity values
testEntity.setValue(testAtt1, forKey: "testAtt1")
testEntity.setValue(testAtt2, forKey: "testAtt2")

//save the object
do {
    try context.save()
    print("saved!")
} catch let error as NSError  {
    print("Could not save \(error), \(error.userInfo)")
} catch {

}
 mumu07 мар. 2017 г., 06:24
Не удалось загрузить класс с именем «ProjectName.EntityName» для объекта «EntityName». Класс не найден, вместо него используется NSManagedObject по умолчанию.

Ваш ответ на вопрос