10

在之前的 Swift 中,我可以使用这样的代码将新数据添加到我的数据模型中的“TestEntity”。

NSManagedObject是为我的“TestEntity”创建的,我可以使用“点”语法设置它的属性

最后,我会保存上下文

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

此代码在 Swift 3 中不起作用。当我运行它时,我收到以下运行时错误:

无法将“NSManagedObject_TestEntity_”(0x175306b0)类型的值转换为“testCoreData.TestEntity”(0xd6bb8)。2016-06-19 11:07:52.305195 testCoreData [689:264453] 无法将“NSManagedObject_TestEntity_”(0x175306b0)类型的值转换为“testCoreData.TestEntity”(0xd6bb8)

任何人都可以阐明如何在 Swift 3 中完成这项工作吗?

问题的第二部分是如何再次访问数据。以下代码以错误结尾:

致命错误:NSArray元素无法匹配 Swift 数组元素类型

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

4 回答 4

9

如果有NSManagedObject子类TestEntity,则新语法是

let entity = TestEntity(context: context)
entity.testAttribute="test value"
于 2016-06-19T09:45:54.980 回答
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 {

}
于 2017-03-04T22:01:56.283 回答
1

工作示例:

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。以前的奇怪行为似乎是由该值为空引起的。

于 2016-06-25T16:14:55.953 回答
0

我不是 Core Data 专家,但 API 提供了 3 种不同的创建NSManagedObject实例的方法。我不知道它们中的任何一个是否比另一个提供任何好处。

假设您有一个名为 entity/NSManagedObject 的子类TestEntity,那么以下所有内容都是相同的:


新方式(无需铸造)+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 {

}
于 2018-12-19T18:57:21.767 回答