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 Swift3. 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 swift3, please? Any help is highly appreciated. Thank you.
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 {
}
working example:
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.
If there is a
NSManagedObject
subclassTestEntity
the new syntax isI'm not an core-data expert, but the API offers 3 distinct ways of creating an
NSManagedObject
instance. I'm not aware if any of them offer any benefit over the other.Assuming you have an entity/NSManagedObject subclass called
TestEntity
then all of the below are the same:New way (no casting required)
+iOS10
:Older ways (casting is not required if you're ok with using
setValue
. With casting you can use dot notation.+iOS3
or:
once you create the NSManagedObject instance and assign its attributes then you just save it in the context.