2017-03-08 65 views
0

我正在使用核心數據,當我嘗試讀取我的屬性時,它們被讀作數字,如0和1.這是我的核心數據建立。我的最終目標是將布爾值保存爲true或false,然後閱讀它。我在我的設置中做錯了什麼,或者錯過了什麼?我看過帖子 iPhone: Save boolean into Core Data除了在OBJ C,我相信布爾值在Datamodel選項中現在可用。我正在使用核心數據,我的布爾值正在被讀作

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鍵

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)") 
    } 

} 
+2

可能重複的[iPhone:保存布爾到核心數據](http://stackoverflow.com/questions/2937945/iphone-save-boolean-into-core-data) – keithbhunter

+0

嗯,這是迅速,核心數據已經改變了在Swift 3中很多。它似乎在datModel中,它可以讓你設置一個屬性爲一個布爾值。 –

回答

2

如果選擇屬性,然後打開「數據模型檢查」選項卡上有一個「使用標量類型」選項,將允許您直接與Bool工作鍵入而不是底層的NSNumber值。

enter image description here

我可以證實,在斯威夫特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 { 

    } 
} 
+0

謝謝你的救星答案! –

+0

我想知道您是否可以回答關於核心數據的更多問題。所以我試圖用核心數據保存一組自定義對象。自定義對象已經存在,但我不知道如何去寫和保存它們。我可以保存自定義對象嗎?如果是這樣,它會是一個屬性,?我將如何改變這種類型?或者我會創建一個該類對象的類,並設置每個屬性以匹配對象中存在的內容?感謝您的幫助。如果你願意,我會在另一個問題上打開這個,這樣你就可以在那裏回答。 –

+0

如果您不想將自定義對象建模爲自己的CoreData實體,則可以使用'transformable'屬性保存自定義對象。這裏的簡短答案是讓您的自定義對象實現'NSCoding'協議,以便您的核心數據存儲可以將您的對象轉換爲二進制blob進行存儲。我試圖找到一個相關的問題鏈接,但令人驚訝的是還沒有被要求(斯威夫特)。 – MathewS

相關問題