【问题标题】:swift - CoreData inManagedObjectContext is nilswift - CoreData inManagedObjectContext 为零
【发布时间】:2015-06-21 08:12:36
【问题描述】:

我正在尝试将数据保存到 coredata,但我从 insertIntoManagedObjectContext 收到“在展开可选值时意外发现 nil”错误。 我仔细检查了我的实体(文章)、属性(articleID、isFavorite)的命名。

但是我找不到错误的原因。

            func saveArticleAsFav(articleID: Int){

            let isFav = true

            let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
            let managedContext = appDelegate.managedObjectContext!


            let entity = NSEntityDescription.entityForName("Article", inManagedObjectContext: managedContext)

            // Error here:
            let item = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: managedContext)

            item.setValue(articleID, forKey: "articleID")
            item.setValue(isFav, forKey:"isFavorite")

            var error: NSError?
            if !managedContext.save(&error){
                println("Could not save \(error), \(error?.userInfo)")
            }

            articleLocalData.append(item)
            println(self.articleLocalData)

        }

编辑:我尝试初始化 coredata:

import Foundation
import CoreData

class saveArticleAsFav {

    var articleLocalData = [NSManagedObject]()

    var context:NSManagedObjectContext


    init(context:NSManagedObjectContext) {
        self.context = context
    }

    func saveArticleAsFav(articleID: Int){

        let isFav = true
        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        let managedContext = appDelegate.managedObjectContext!

        let entity = NSEntityDescription.entityForName("Article", inManagedObjectContext: managedContext)
        let item = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: managedContext)

        item.setValue(articleID, forKey: "articleID")
        item.setValue(isFav, forKey:"isFavorite")

        var error: NSError?
        if !managedContext.save(&error){
            println("Could not save \(error), \(error?.userInfo)")
        }

        articleLocalData.append(item)
        println(self.articleLocalData)

    }
}

然后我在我的邮件表格视图中调用 func: 并收到以下错误: “无法使用类型为 '(articleID: Int)' 的参数列表调用类型 'saveArticleAsFav' 的初始化程序”

saveArticleAsFav(articleID: articleID!)

【问题讨论】:

  • 请不要覆盖您之前的问题。否则其他人将无法理解答案。

标签: ios swift core-data


【解决方案1】:

您在违规行中使用! 强制解包的唯一选项是entity。因此实体可能是nil

一个原因可能是模型中的实体名称不是"Article"

我通常不使用实体,而是使用 Apple 的便捷方法直接插入对象,只使用实体名称。

let item = NSEntityDescription.insertNewObjectForEntityForName(
           "Article", inManagedObjectContext: managedContext) as Article

如果名称不正确或上下文无效,此方法将失败。

请注意,Swift 编译器并不总是会给出确切的原因。可能是调用函数传递了无效的articleID

此外,您发布的代码存在一些严重缺陷。您的 init 方法意味着托管对象上下文是在其他地方创建的,并且需要使用有效的上下文初始化该类。这似乎是提供托管对象上下文的一种非常麻烦的方式。您继续忽略它并使用来自应用程序委托的另一个上下文。

另外,你的类名看起来真的很像一个方法。这应该是一个什么样的班级?按照惯例,类应以大写字母开头。

【讨论】:

  • 谢谢@Mundi。我重写了你提到的课程。请看我的编辑。但这次我卡在了别的地方……
  • 那是我上面提到的“严重缺陷”造成的。如果你无法区分函数和类,我强烈建议你先做一些更基础的教程。现在的问题确实是一个不同的问题,因此您应该接受这个答案并发布一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多