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 {
}
If there is a NSManagedObject
subclass TestEntity
the new syntax is
let entity = TestEntity(context: context)
entity.testAttribute="test value"
//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 {
}
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With