如何使用核心数据更新属性

时间:2014-12-11 15:05:28

标签: swift ios8 xcode6

我正在尝试使用SWIFT中的核心数据进行写入和读取。在编写新数据和读取现有数据时,一切都很好。但是现在我想更新一条记录(让我们说“pagina”是“1”)突然间我觉得完全失去了!我已经研究过批量更新,因为它似乎是最好的方法。不幸的是,我发现的所有教程对我来说似乎都不够基本。

我创建了实体“Stories”并添加了三个属性:“pagina”(String),“plaats”(String)和“naam”(String)。我打算这样做的方法是从txtPagina.text中检索页码并将其存储在变量Pagina中。 然后使用txtPlaats.text和txtNaam.text的UITextField内容更新记录,其中pagina = Pagina。看起来很简单。不幸的是,我似乎无法弄清楚批量更新。 谁能帮我?我完全迷失在这里。

@IBAction func btnSave(){

    var Pagina = txtPagina.text
    var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
    var context:NSManagedObjectContext = appDel.managedObjectContext!

    //check if data exists
    var request = NSFetchRequest(entityName: "Stories")
    var results:NSArray = context.executeFetchRequest(request, error:nil)!

    if(results.count > 0) {
        Pagina = "\(results.count)"
        txtPagina.text = Pagina

        //code to update plaats and naam where pagina = Pagina

    } else {
        var newStory = NSEntityDescription.insertNewObjectForEntityForName("Stories", inManagedObjectContext: context) as NSManagedObject
        newStory.setValue(Pagina, forKey: "pagina")
        newStory.setValue("\(txtPlaats.text)", forKey: "plaats")
        newStory.setValue("\(txtNaam.text)", forKey: "naam")

        context.save(nil)

        println(newStory)
        println("Object Saved.")
    }

}

2 个答案:

答案 0 :(得分:0)

如果您遇到的唯一问题是更新记录,则看起来您的问题是您在更新后无法拨打context.save()。这应该可以解决这个问题。

答案 1 :(得分:0)

我现在有一些工作,但我不确定它是最有效的方式:

我创建了一个名为Stories的课程:

import UIKit
import CoreData

@objc(Stories)
class Stories: NSManagedObject {  
    @NSManaged var pagina:String
    @NSManaged var plaats:String
    @NSManaged var naam:String    
}

现在我的btnSave动作是这样的:

@IBAction func brnSave(sender: AnyObject) { 
    var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
    var context:NSManagedObjectContext = appDel.managedObjectContext!
    var request = NSFetchRequest(entityName: "Stories")
    var results:NSArray = context.executeFetchRequest(request, error: nil) as [Stories]
    if (results.count > 0) {
        println(results.count)
        if (results.count >= txtPagina.text.toInt()) {
        for res in results{
            var data = res as Stories
            println(data.plaats)
            if (data.pagina == txtPagina.text) {
                data.plaats = txtPlaats.text
                data.naam = txtNaam.text
                context.save(nil)
                println("Page \(data.pagina) updated")
                }
            }
        } else {
            // Save new Story
            var ent = NSEntityDescription.entityForName("Stories", inManagedObjectContext: context)
            var newStory = Stories(entity: ent!, insertIntoManagedObjectContext: context)
            newStory.pagina = txtPagina.text
            newStory.plaats = txtPlaats.text
            newStory.naam = txtNaam.text
            context.save(nil)
            println("New story saved")
            // Save new Story end

        }

    } else {

        // Save new Story
        var ent = NSEntityDescription.entityForName("Stories", inManagedObjectContext: context)
        var newStory = Stories(entity: ent!, insertIntoManagedObjectContext: context)
        newStory.pagina = txtPagina.text
        newStory.plaats = txtPlaats.text
        newStory.naam = txtNaam.text
        context.save(nil)

        println(newStory)
        println("New story saved")
        // Save new Story end

    }
}

代码有效,但似乎并不完美。 有没有办法让这个更有效率?更新数组时,我基本上重写了整个coredata表,而不仅仅是更新已更改的数据。我只能想象当有更多数据时,这会有什么表现呢!