【问题标题】:Core Data Scalar error only on some devices仅在某些设备上出现核心数据标量错误
【发布时间】:2015-05-24 14:59:46
【问题描述】:

我主要使用 iPhone 6、6 plus 和 iPad 进行测试。今天刚在 iPhone 5 模拟器上试用了我的应用,但遇到了 Core Data 错误。

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

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

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

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

寻找解决方案和解释为什么这种情况只发生在某些设备上,这样我就可以学习了!

【问题讨论】:

    标签: ios swift core-data


    【解决方案1】:

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

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

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

    【讨论】:

    • 我确实让 Xcode 创建了类,但后来我添加了 ID。此外,如果我将该属性设置为 Int64,则当我尝试向该属性输入数据时,我必须在整个代码中进行转换。有没有办法让模型匹配 Int?
    • @Tim:Core Data 只有固定大小的整数(16、32、64 位)。
    • 我明白了。所以没有办法在我的代码中使用 Int 然后在保存到 CD 时转换为一种大小?非常感谢您的澄清,我只是在寻找更通用的解决方案。
    • @Tim:您可以将属性定义为NSNumber *,而不是正确的标量。 Swift 编译器应该自动进行大多数转换。 – 我是在手机上写的,所以目前无法提供更多细节。
    • NSNumber 是神奇的成分!我只需要在我提供 entity.id 的地方更改两个调用 Int 的函数。一旦那些人也寻找 NSNumber,瞧!如果您添加答案,我会接受。谢谢!
    【解决方案2】:

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

    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
    

    【讨论】:

      【解决方案3】:

      不要忘记尝试“清洁”!即使我从设备中删除了该应用程序,这也为我解决了问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-08
        • 1970-01-01
        相关资源
        最近更新 更多