Обновите атрибут CoreData типа Int32

Я хотел бы получить значение основного атрибута данных, и после получения этого объекта / значения я хотел бы обновить его. Это мой код:

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. 'Int32' is not identical to 'AnyObject' в этой строке кода: theme.setValue(newValueThemeChanges, forKey: "numberThemeChanged")

Вы знаете, как я могу это сделать / что не так с моим кодом? Спасибо за Ваш ответ!

1 ответ

Решение

Методы кодирования ключ-значение

func valueForKey(key: String) -> AnyObject?
func setValue(value: AnyObject?, forKey key: String)

работа со значениями типа AnyObjectдля целочисленного атрибута это экземпляры NSNumber,

Существует автоматическое соединение между Int а также NSNumber, но не между Int32 а также NSNumber (и это не имеет никакого отношения к тому факту, что вы определяете свойство как "Integer 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 -> Editor -> Create NSManagedObject subclass ... и отметьте опции "Использовать скалярные свойства для примитивных типов данных". Это даст вам подкласс управляемого объекта со свойством

    @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)
Другие вопросы по тегам