Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to insert new data to entity in Swift?

In Swift previously, I was able to use a code like this to add new data to my "TestEntity" in my data model.

NSManagedObject was created for my "TestEntity" and I was able to set its attributes with the "dot" syntax

At the end, I would save the context

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

This code does not work in Swift 3. When I run it, i get the following runtime error:

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)

Can anyone shed some light on how this should be done in Swift 3?

The second part of the question is how to access the data again. the following code ends with an error:

fatal error: NSArray element failed to match the Swift Array Element type

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 {
            
}
like image 318
matyasl Avatar asked Jun 19 '16 09:06

matyasl


3 Answers

If there is a NSManagedObject subclass TestEntity the new syntax is

let entity = TestEntity(context: context)
entity.testAttribute="test value"
like image 174
vadian Avatar answered Nov 20 '22 15:11

vadian


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

}
like image 3
Mohamed Hashem Avatar answered Nov 20 '22 14:11

Mohamed Hashem


working example:

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

Data model inspector TestEntity Class name needs to be set to TestEntity. Previous strange behaviour seemed to be caused by this value to be blank.

like image 1
matyasl Avatar answered Nov 20 '22 14:11

matyasl