仅在某些设备上出现核心数据标量错误
Posted
技术标签:
【中文标题】仅在某些设备上出现核心数据标量错误【英文标题】: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。这可能是我的问题,因为我在不知道什么是最好的情况下选择了它。我在模型和类中还有其他属性,但都是字符串。
寻找解决方案和解释为什么这种情况只发生在某些设备上,这样我就可以学习了!
【问题讨论】:
【参考方案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】:不要忘记尝试“清洁”!即使我从设备中删除了该应用程序,这也为我解决了问题。
【讨论】:
以上是关于仅在某些设备上出现核心数据标量错误的主要内容,如果未能解决你的问题,请参考以下文章
#error Unsupported architecture - cdefs.h - Swift BLE 项目在 Swift 2.3 中运行良好,但在 Swift 3.0 中仅在真实设备上出现错误