2015-04-04 48 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