我正在使用核心数据,我的布尔值被读取为数字

I'm using core data, and my booleans are being read as a number

我正在使用核心数据,当我尝试读取我的属性时,它们被读取为数字,例如 0 和 1。这是我的核心数据设置。我的最终目标是将布尔值保存为 true 或 false,然后按原样读取。我是在我的设置中做错了什么,还是遗漏了什么?我看过 post iPhone: Save boolean into Core Data 除了在 OBJ C 中,我相信布尔值现在在数据模型选项中可用。

 func saveFilters(bathAny: Bool, bath1: Bool, bath2: Bool, bath3: Bool, bath4: Bool){
    let context = getContext()

    let entity = NSEntityDescription.entity(forEntityName: "FilterCoreDataObj", in: context)
    let transc = NSManagedObject(entity: entity!, insertInto: context)

    //SET ENTITY VALUES 

    transc.setValue(bathAny, forKey: "bathAny")
     transc.setValue(bath1, forKey: "bath1")
     transc.setValue(bath2, forKey: "bath2")
     transc.setValue(bath3, forKey: "bath3")
     transc.setValue(bath4, forKey: "bath4")


    do {
        try context.save()
        print("saved")
    } catch let error as NSError {
        print("could not save \(error), \(error.userInfo)")
    } catch {

    }
}

读取函数

  func getTranscriptions(bathAny: Bool, bath1: Bool, bath2: Bool, bath3: Bool, bath4: Bool) {
    let fetchRequest: NSFetchRequest<FilterCoreDataObj> = FilterCoreDataObj.fetchRequest()

    do {
        let searchResults = try getContext().fetch(fetchRequest)
        print("num of results = \(searchResults.count)")
        for trans in searchResults  {
            print("bath 1 \(trans.value(forKey: "bath1"))")


        }


    } catch {
        print("Error with request: \(error)")
    }

}

如果您 select 一个属性,然后打开 'Data Model inspector' 选项卡,有一个 'use scalar type' 选项可以让您直接使用 Bool 类型而不是基础 NSNumber 价值。

我可以确认,在 Swift 3(使用自动生成的托管对象子类)中,这是开箱即用的。

如果您创建自己的 NSManagedObject 子类(或扩展),则需要公开 属性。

p.s。作为旁注,我猜你的项目目前没有对你的 NSManagedObjects 使用任何子类或扩展。如果您是 CoreData 的新手,这可能是一个令人困惑的话题,因为 CoreData 工具随着 Xcode 8.

发生了巨大变化

作为一个简短的介绍,您可以为您的实体手动创建一个子类(或扩展)(或者我的偏好 - Xcode 自动为您生成它们)。

在您的情况下,扩展名如下所示:

extension FilterCoreDataObj {
    @NSManaged public var bathAny: Bool
    @NSManaged public var bath1: Bool
    @NSManaged public var bath2: Bool
    @NSManaged public var bath3: Bool
    @NSManaged public var bath4: Bool
} 

然后使用实体变得容易得多,因为您可以直接访问属性而不是使用字符串作为关键路径:

func saveFilters(bathAny: Bool, bath1: Bool, bath2: Bool, bath3: Bool, bath4: Bool){

    let context = getContext()

    let transc = FilterCoreDataObj(context: context)
    //SET ENTITY VALUES

    transc.bathAny = bathAny
    transc.bath1 = bath1
    transc.bath2 = bath2
    transc.bath3 = bath3
    transc.bath4 = bath4

    do {
        try context.save()
        print("saved")
    } catch let error as NSError {
        print("could not save \(error), \(error.userInfo)")
    } catch {

    }
}