核心数据 - 编辑、递增和保存属性到现有实体

Posted

技术标签:

【中文标题】核心数据 - 编辑、递增和保存属性到现有实体【英文标题】:Core Data - Editing, Incrementing and Saving Attribute to already exisiting Entity 【发布时间】:2016-12-11 03:48:09 【问题描述】:

好的,所以我是 CoreData 的新手并使用 NSNumber(大约一天),我观看了有关 CoreData 的教程并设法使用我称为“成就”但现在的同一实体在 coreData 中存储了许多不同的成就我正在尝试根据给定的名称来获取数据,以搜索特定的“成就”并编辑其属性。

func addOneToAchievement(AchName: String) 

    let getDataRequest:NSFetchRequest<Achievement> = Achievement.fetchRequest()
    getDataRequest.predicate = NSPredicate(format: "theSearchName == %@" , AchName)

    do 

        let searchResults = try CoreDatabaseContoller.getContext().fetch(getDataRequest)

        //print("number of results: \(searchResults.count)")

        for result in searchResults as [Achievement] 

           // print("\(result.theName!) \(result.theDescription!) is \(result.theImage!) \(result.aAmount!) / \(result.aNeededAmount!) is \(result.aStage!)")

            result.aAmount! += 1

            if result.aAmount! == result.aNeededAmount 

                 result.theImage! = "diamonds2"
                 result.aNeededAmount! = 100
                 result.aStage! = 2

            
        
    

    catch 

        print("ERROR: \(error)")

    

但是我遇到了一个问题,因为我的实体的 amount 属性是一个 NSNumber 并且发现我不能通过

的常用语法来增加它
result.Amount! += 1 

如何增加 result.Amount 的 NSNumber!然后将它与我为该成就更改的所有其他属性一起保存?

【问题讨论】:

【参考方案1】:

我个人一直将标准 Swift Int 类型用于托管的 Core Data 属性。根据我的经验,NSManagedObject 子类自动为我提供了此功能,但如果它为您生成NSNumber,则可能有一种简单的方法可以更改它(我还没有在 Xcode 8 中完成 Core Data)。

无论如何,NSNumber 只是一个数字的包装,因此您可以通过intValue 获取实际值。

let amount = result.aAmount!.intValue
a = NSNumber(value: amount + 1)

更改所有内容后(假设更改发生在NSManagedObject 子类和标记为@NSManged 的属性上),您可以通过在上下文中调用save() 来保存。

do 
    try CoreDatabaseContoller.getContext().save()
 catch 
    // Error on Save

【讨论】:

以上是关于核心数据 - 编辑、递增和保存属性到现有实体的主要内容,如果未能解决你的问题,请参考以下文章

核心数据保存和加载到多个实体

核心数据不保存一个实体的属性

核心数据实体布尔属性未保存在表格单元格删除中

向核心数据实体添加瞬态属性是不是需要新版本模型?

创建了核心数据实体但未保存属性

如何将数组保存到实体的属性中?