Swift更新现有项目核心数据

时间:2014-12-11 20:17:32

标签: core-data swift save xcode6

我见过很多带有一个视图控制器的例子,用于添加或更新核心数据项。有关在单独的视图控制器中进行优缺点的任何想法吗?

我尝试进行更新的代码我认为我缺少一个关键部分来让它工作。

    @IBAction func saveItem(sender: AnyObject) {
    let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
    let context: NSManagedObjectContext = appDel.managedObjectContext!
    let en = NSEntityDescription.entityForName("Items", inManagedObjectContext: context)
    var existingItem = dataModel.self

    if (row > 0) {
        println(teaname.text)

       existingItem.setValue(teaname.text as String, forKey: "name")
       existingItem.setValue(teatype.text as String, forKey: "type")
       existingItem.setValue(qty.text as String, forKey: "amount")
       existingItem.setValue(temp.text as String, forKey: "temp")
       existingItem.setValue(time.text as String, forKey: "time")
    } else {

    }

    context.save(nil)

    self.navigationController?.popViewControllerAnimated(true)

}

我得到(lldb)在existingItem.setValue上的线程断点(teaname.text为String,forKey:" name")

1 个答案:

答案 0 :(得分:3)

看起来您实际上没有要更新的特定对象。我使用以下函数通过其唯一ID获取对象。只有拥有一个对象(我的名为Event)才能更新它。

func fetchEvent(eventID: Int) -> Event? {

    // Define fetch request/predicate/sort descriptors
    var fetchRequest = NSFetchRequest(entityName: "Event")
    let sortSections = NSSortDescriptor(key: "eTitle", ascending: true)
    let sortDescriptor = NSSortDescriptor(key: "eID", ascending: true)
    let predicate = NSPredicate(format: "eID == \(eventID)", argumentArray: nil)
    var error = NSErrorPointer()

    // Assign fetch request properties
    fetchRequest.predicate = predicate
    fetchRequest.sortDescriptors = [sortSections, sortDescriptor]
    fetchRequest.fetchBatchSize = 1
    fetchRequest.fetchLimit = 1

    // Handle results
    let fetchedResults = managedObjectContext?.executeFetchRequest(fetchRequest, error: error)

    if fetchedResults?.count != 0 {

        if let fetchedEvent: Event = fetchedResults![0] as? Event {
            println("Fetched object with ID = \(eventID). The title of this object is '\(fetchedEvent.eTitle)'")
            return fetchedEvent
        }
    }
    return nil
}

获取对象并拥有要更新的核心数据对象后,您可以像这样更新它。

func updateEvent(eventDict: Dictionary<String, AnyObject>, id: Int) {
    if let event: Event = fetchEvent(id) {
        println(event)
        event.eID = id
        event.eTitle = getString(eventDict["title"])
        event.eLocation = getString(eventDict["location"])
        event.eDescription = getString(eventDict["description"])
        event.eStart = getDate(eventDict["startDate"])
        event.eEnd = getDate(eventDict["endDate"])
        event.eMod = NSDate()
        event.eSecID = getSecID(event)

    }
}

然后您可能希望保存托管对象上下文。