2015-04-04 97 views
2

我想獲取核心數據屬性的值,並在獲取此對象/值後,我想更新它。這是我的代碼:更新Int32類型的CoreData屬性

var numberOfChanges:Int32? 
numberOfChanges = theme.valueForKey("numberThemeChanged") as Int32 
var newValueThemeChanges:Int32? 
newValueThemeChanges = numberOfChanges+1 
theme.setValue(newValueThemeChanges, forKey: "numberThemeChanged") 

,我發現了以下錯誤:

  1. 在這行代碼Type 'Int32' does not conform to protocol 'AnyObject'numberOfChanges = theme.valueForKey("numberThemeChanged") as Int32
  2. 在這行代碼
  3. 'Int32' is not identical to 'AnyObject'theme.setValue(newValueThemeChanges, forKey: "numberThemeChanged")

你知不知道我該怎麼辦呢/有什麼錯我的代碼? 感謝您的回答!

+0

設置值後。保存NSManagedObjectContext對象。 – Jassi 2015-04-04 12:19:33

+0

我保存了NSMangedObjectContext對象。 – horst 2015-04-04 12:39:59

+0

無論值是否更新,您都可以通過從核心數據中提取對象來檢查該對象。 – Jassi 2015-04-04 12:41:18

回答

4

的鍵 - 值編碼方法

與類型 AnyObject的值
func valueForKey(key: String) -> AnyObject? 
func setValue(value: AnyObject?, forKey key: String) 

工作,爲的整數屬性這些 是NSNumber實例。

IntNSNumber,但Int32NSNumber之間不 之間的自動橋接(這無關與 事實,你定義的核心數據 模型檢查屬性爲「整型32」) 。

您有幾種選擇:

  • 只需使用Int類型的變量:

    var numChanges = theme.valueForKey("numberThemeChanged") as Int 
    numChanges++ 
    theme.setValue(numChanges, forKey: "numberThemeChanged") 
    
  • 使用Int32,並且將來自和NSNumber明確:

    var numberOfChanges = (theme.valueForKey("numberThemeChanged") as NSNumber).intValue // Int32 
    numberOfChanges++ 
    theme.setValue(NSNumber(int: numberOfChanges), forKey: "numberThemeChanged") 
    
  • 使用Xcode - >編輯器 - >創建NSManagedObject子類...並檢查「使用基元數據類型的標量屬性」選項。 這會給你一個管理對象子與物業

    @NSManaged var numberThemeChanged: Int32 
    

    ,您可以不需要鍵 - 值編碼訪問屬性:

    var numberOfChanges = theme.numberThemeChanged 
    numberOfChanges++ 
    theme.numberThemeChanged = numberOfChanges 
    

這是一個完整的「創建 - 或 - 更新「示例:

var theme : Entity! 

let request = NSFetchRequest(entityName: "Entity") 
var error : NSError? 
if let result = context.executeFetchRequest(request, error: &error) as [Entity]? { 
    if result.count > 0 { 
     // (At least) one object found, set `theme` to the first one: 
     theme = result.first! 
    } else { 
     // No object found, create a new one: 
     theme = NSEntityDescription.insertNewObjectForEntityForName("Entity", inManagedObjectContext: context) as Entity 
     // Set an initial value: 
     theme.setValue(0, forKey: "numberThemeChanged") 
    } 
} else { 
    println("Fetch failed: \(error?.localizedDescription)") 
} 

// Get value and update value: 
var numChanges = theme.valueForKey("numberThemeChanged") as Int 
numChanges++ 
theme.setValue(numChanges, forKey: "numberThemeChanged") 

// Save context: 
if !context.save(&error) { 
    println("Save failed: \(error?.localizedDescription)") 
} 

println(numChanges) 
+0

我不知道爲什麼,但如果我第一次啓動我的應用程序,所有作品都完美無缺。如果我第二次啓動應用程序,我得到的數字是0(必須是1,因爲代碼已經運行了1次)。所以看起來這個號碼最後一次沒有儲存。 – horst 2015-04-04 15:27:26

+0

@horst:有兩種可能的原因:1)你沒有保存上下文(但你在評論中聲稱你是這麼做的)。 - 2)每次創建一個* new *對象,而不是獲取和更新現有對象。 – 2015-04-04 15:29:25

+0

@horst:我已經添加了更多的示例代碼,這應該有助於您開始:) – 2015-04-04 15:45:31