CoreData添加对象

4

我制作了一个使用核心数据的应用程序。我编写了一个函数,可以保存1或2个值/将数据写入核心数据。以下是该方法:

    func saveName(name: String) {

    let myDate:NSDate = NSDate()
    let context = self.fetchedResultsController.managedObjectContext
    let entity = self.fetchedResultsController.fetchRequest.entity!
    let newManagedObject = NSEntityDescription.insertNewObjectForEntityForName(entity.name!, inManagedObjectContext: context) as NSManagedObject

    if markCell == true {
        newManagedObject.setValue(name, forKey: "markedCell")
        markCell = false
    }

    else {
        newManagedObject.setValue(name, forKey: "name")
        newManagedObject.setValue(myDate, forKey: "datum")
    }

    // Save the context.
    var error: NSError? = nil
    if !context.save(&error) {
        abort()
    }
}

如果 markCell == true,在函数 cellForRowAtIndexPath 中会出现崩溃。如果 markCell == false(进入 else),一切都完美。

如果我运行这个函数:

    func saveName(name: String) {

    let myDate:NSDate = NSDate()
    let context = self.fetchedResultsController.managedObjectContext
    let entity = self.fetchedResultsController.fetchRequest.entity!
    let newManagedObject = NSEntityDescription.insertNewObjectForEntityForName(entity.name!, inManagedObjectContext: context) as NSManagedObject

        newManagedObject.setValue(name, forKey: "markedCell")
        markCell = false
        newManagedObject.setValue(name, forKey: "name")
        newManagedObject.setValue(myDate, forKey: "datum")

    // Save the context.
    var error: NSError? = nil
    if !context.save(&error) {
        abort()
    }
}

没有崩溃发生,但我也添加了一个值到markedCell。我只想在bool被设置为true时(用户按下按钮-> bool将被设置为true并调用func saveName ),才将一个值添加到markedCell 中。
从core data加载数据(创建UITableViewCell):
//Get task
    let context = self.fetchedResultsController.managedObjectContext
    let object = self.fetchedResultsController.objectAtIndexPath(indexPath) as  NSManagedObject
    var taskString:NSString
    taskString = object.valueForKey("name") as String
    cell.textLabel!.text = object.valueForKey("name") as? String
    //Set accessory type
    var request:NSFetchRequest = NSFetchRequest(entityName: "Person")
    request.predicate = NSPredicate(format:"markedCell = %@", taskString)
    var results : [NSManagedObject] = context.executeFetchRequest(request, error: nil) as [NSManagedObject]
    if (results.count > 0) {
        //Element exists
        cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator
        println("Cell is marked")
    }
    else {
        //Doesn't exist
        cell.accessoryType = UITableViewCellAccessoryType.None
        println("Cell isn't marked")
    }

1
请提供崩溃时精确的错误信息。 - gutenmorgenuhu
我晚点回家会检查它。你确定函数被调用时传递的名称变量有一个值吗? - gutenmorgenuhu
你能提供整个项目(或所有相关部分)吗? - gutenmorgenuhu
你的错误信息是什么? 你的对象是否有标记单元格键? - gutenmorgenuhu
1
你是否没有在if语句为真且需要设置'Datum'时进行设置?此外,我认为将NSManagedObject作为子类是一个好的实践,可以参考这个链接:http://code.tutsplus.com/tutorials/core-data-from-scratch-subclassing-nsmanagedobject--cms-21880(这是obj-C)或者http://www.andrewcbancroft.com/2014/07/17/implement-nsmanagedobject-subclass-in-swift/。 - JaySH
显示剩余2条评论
1个回答

0
我可以打赌问题来自于您的 Core Data 模型中 markedCell 被声明为可选属性,而 name 或 / 和 datum 不是可选的。 如果是这种情况,当进入else循环时,您的保存工作正常,因为此时您已经具有:
markedCell == nil //this is allowed in your Core Data model
name != nil
datum != nil

然而,当您不进入else循环时,您会得到:

markedCell != nil
name == nil
datum == nil

而且最后两行中的一行与您的Core Data模型不兼容。如果要使用原始代码,则需要确保在此处提到的所有属性都声明为可选。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接