当传递给自定义迁移策略中的模型迁移函数时,核心数据实体中的 Int16 支持的枚举属性似乎具有不正确的值
Int16 backed enum attribute in Core Data entity appears to have incorrect value when passed to a model migration function in a custom migration policy
我正在执行核心数据模型迁移;在我的映射模型自定义策略函数中,传递的属性值之一不正确。这是为什么?
背景:
我的核心数据实体 Book
有一个属性 readState
,其类型为 Integer16
。与此实体对应的 class 将此属性表示为具有枚举类型(为清楚起见删除了其他属性):
@objc(Book)
class Book: NSManagedObject {
@NSManaged var readState: BookReadState
}
@objc enum BookReadState: Int16 {
case reading = 1
case toRead = 2
case finished = 3
}
在此应用程序中,这始终符合预期。
情况:
我正在执行两个模型版本之间的迁移。两个版本不碰readState
。 Book
实体的实体映射具有由以下值表达式指定的属性映射(对于某些其他属性):
FUNCTION($entityPolicy, "currentPageForCurrentPage:readState:", $source.currentPage, $source.readState)
我的实体映射有自定义策略class,如下:
class BookMapping_12_13: NSEntityMigrationPolicy {
@objc func currentPage(forCurrentPage currentPage: NSNumber?, readState: Int16) -> NSNumber? {
// function implementation here
}
}
问题:
当在 readState
属性等于 .reading
的 Book
实体上执行此迁移时(例如 1
),函数传递值 17
readState
!
这是为什么?枚举存储在 Core Data 中的方式是否有些奇怪?如果需要,我很乐意提供更多详细信息。
实体映射函数签名必须使用NSNumber
,而不是Int16
。例如:
@objc func currentPage(forCurrentPage currentPage: NSNumber?, readState: NSNumber) -> NSNumber?
然后 readState
被正确传递为 1
。我不明白为什么。
我正在执行核心数据模型迁移;在我的映射模型自定义策略函数中,传递的属性值之一不正确。这是为什么?
背景:
我的核心数据实体 Book
有一个属性 readState
,其类型为 Integer16
。与此实体对应的 class 将此属性表示为具有枚举类型(为清楚起见删除了其他属性):
@objc(Book)
class Book: NSManagedObject {
@NSManaged var readState: BookReadState
}
@objc enum BookReadState: Int16 {
case reading = 1
case toRead = 2
case finished = 3
}
在此应用程序中,这始终符合预期。
情况:
我正在执行两个模型版本之间的迁移。两个版本不碰readState
。 Book
实体的实体映射具有由以下值表达式指定的属性映射(对于某些其他属性):
FUNCTION($entityPolicy, "currentPageForCurrentPage:readState:", $source.currentPage, $source.readState)
我的实体映射有自定义策略class,如下:
class BookMapping_12_13: NSEntityMigrationPolicy {
@objc func currentPage(forCurrentPage currentPage: NSNumber?, readState: Int16) -> NSNumber? {
// function implementation here
}
}
问题:
当在 readState
属性等于 .reading
的 Book
实体上执行此迁移时(例如 1
),函数传递值 17
readState
!
这是为什么?枚举存储在 Core Data 中的方式是否有些奇怪?如果需要,我很乐意提供更多详细信息。
实体映射函数签名必须使用NSNumber
,而不是Int16
。例如:
@objc func currentPage(forCurrentPage currentPage: NSNumber?, readState: NSNumber) -> NSNumber?
然后 readState
被正确传递为 1
。我不明白为什么。