2016-06-19 1 views
8

Dans swift précédemment, j'ai été capable d'utiliser un code comme celui-ci pour ajouter de nouvelles données à mon "TestEntity" dans mon modèle de données.Comment insérer de nouvelles données dans une entité dans Swift3?

NSManagedObject a été créé pour mon « TestEntity » et j'ai pu définir ses attributs avec le « point » syntaxe

A la fin, je sauverais le contexte

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

Ce code ne fonctionne pas travailler dans Swift3. Quand je lance, je reçois l'erreur d'exécution suivante:

Could not cast value of type 'NSManagedObject_TestEntity_' (0x175306b0) to 'testCoreData.TestEntity' (0xd6bb8). 2016-06-19 11:07:52.305195 testCoreData[689:264453] Could not cast value of type 'NSManagedObject_TestEntity_' (0x175306b0) to 'testCoreData.TestEntity' (0xd6bb8)

Quelqu'un peut-il faire la lumière sur la façon dont cela doit être fait dans swift3, s'il vous plaît? Toute aide est grandement appréciée. Merci.

La deuxième partie de la question est de savoir comment accéder à nouveau aux données. le code suivant se termine par une erreur: erreur fatale: élément NSArray n'a pas réussi à correspondre au tableau Swift Type d'élément

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 { 

} 

Répondre

4

S'il y a une NSManagedObject sous-classe TestEntity la nouvelle syntaxe est

let entity = TestEntity(context: context) 
entity.testAttribute="test value" 
+0

L'enregistrement doit être encapsulé dans des blocs 'try-catch'. – Mundi

+0

@Mundi Oui bien sûr, mais ce n'est pas pertinent pour la question. J'ai supprimé la ligne. – vadian

+0

J'ai dû créer NSEntityDescription pour que le code ci-dessus fonctionne. sans elle, je suis une autre erreur d'exécution: application Mettre fin à cause de l'exception non interceptée « NSInvalidArgumentException », la raison: « Une NSManagedObject de classe « testCoreData.TestEntity » doit avoir un NSEntityDescription valide. » 'Laisser entityDes = NSEntityDescription.entity (forEntityName: "TestEntity", dans: contexte) let entité = TestEntity (entité: entityDes !, InsertInto: contexte) entity.testAtt = "attribut test"' Mais cela a fonctionné. Je vous remercie. – matyasl

1

exemple de travail:

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

Inspecteur de modèle de données TestEntity Le nom de la classe doit être défini sur TestEntity. Comportement étrange précédent semblait être causée par cette valeur à être vide.

3
//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 { 

} 
+0

Impossible de charger la classe nommée « ProjectName.EntityName » pour l'entité « EntityName ». Classe non trouvée, utilisant NSManagedObject par défaut. – mumu