【问题标题】:CoreData add objectCoreData 添加对象
【发布时间】:2015-07-10 09:58:06
【问题描述】:

我制作了一个使用核心数据的应用。我制作了一个函数,可以保存 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,我只想在 markedCell 中添加一个值(用户按下按钮 -> bool 将设置为 true 并且将调用 func saveName)。

从核心数据加载数据(创建 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")
    }

【问题讨论】:

  • 请提供您在崩溃时收到的确切消息
  • name 为零。但是保存功能正确吗?
  • 稍后我会在家里检查。您确定在调用函数时传递的名称变量有值吗?
  • 你能提供整个项目(或所有相关部分)吗?
  • 当您的 if 语句为真并且您需要设置它时,您是否没有设置“基准”?此外,我认为将 NSManagedObject 子类化是一种很好的做法,请查看以下链接:code.tutsplus.com/tutorials/…(在 obj-C 中)或andrewcbancroft.com/2014/07/17/…

标签: ios swift core-data ios8


【解决方案1】:

我敢打赌,问题在于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

最后两行之一与您的核心数据模型不兼容。如果你想使用你的原始代码,你需要确保这里提到的所有属性都被声明为可选的。

【讨论】:

    猜你喜欢
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多