仅在某些设备上出现Core Data Scalar错误

时间:2015-05-24 14:59:47

标签: ios swift core-data

我一直在测试主要使用iPhone 6,6 plus和iPad。刚刚在iPhone 5模拟器上尝试了我的应用程序,并收到了Core Data错误。

  

CoreData:error:属性'setId:'是类'AppName.EntityName'上的标量类型,与其Entity属性的标量类型不匹配。动态生成的访问器不支持隐式类型强制。无法为它生成setter方法

现在,我的应用程序中没有'setId'对象,但当然实体确实有一个'ID'对象,它被设置为int。

class Entity: NSManagedObject {
    @NSManaged var id: Int
}

在Core Data模型中,属性类型设置为Integer64。这可能是我的问题,因为我在不知道什么是最好的情况下选择了它。我在模型和类中有其他属性,但它们都是字符串。

寻找修复和解释,为什么只在某些设备上发生这种情况,所以我可以学习!

3 个答案:

答案 0 :(得分:31)

如果Core Data类型是Integer 64,那么您应该将该属性声明为Int64(或者让Xcode创建托管对象子类)。

Int可以是32位或64位,具体取决于处理器架构。

或者,将属性定义为NSNumber*而不是标量属性。当然,您必须注意在32位平台上,值不超过Int的范围。

答案 1 :(得分:1)

或者,您可以编写自己的setter / getter方法,将Int转换为NSNumber实例,并将其传递给原始值。 E.g:

private(set) var publicId: Int {
  get {
    self.willAccessValueForKey("publicId")
    let value = self.primitivePublicId.longValue
    self.didAccessValueForKey("publicId")
    return value
  }
  set {
    self.willChangeValueForKey("publicId")
    self.primitivePublicId = NSNumber(long: newValue)
    self.didChangeValueForKey("publicId")
  }
}
@NSManaged private      var primitivePublicId: NSNumber

答案 2 :(得分:0)

别忘了尝试“清洁”!即使我已从设备中删除了该应用程序,也为我修复了该问题。