swift - CoreData inManagedObjectContext是nil

时间:2015-06-21 08:12:36

标签: ios swift core-data

我正在尝试将数据保存到coredata,但是我从insertIntoManagedObjectContext获取“从unwrapping可选值时意外发现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)

    }
}

然后我在我的邮件tableview中调用func:并收到以下错误: “无法使用类型为'(articleID:Int)'的参数列表调用'saveArticleAsFav'类型的初始值设定项”

saveArticleAsFav(articleID: articleID!)

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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

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

此外,您的类名看起来非常像一个方法。这应该是什么类?按照惯例,课程应以大写字母开头。