我正在尝试将数据保存到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!)
答案 0 :(得分:0)
唯一可选的是,!
在强行中使用entity
强制解包。因此,实体可能是nil
。
一个原因可能是模型中的实体名称不是"Article"
。
我通常不使用实体,而只使用实体名称直接使用Apple的便捷方法插入对象。
let item = NSEntityDescription.insertNewObjectForEntityForName(
"Article", inManagedObjectContext: managedContext) as Article
如果名称不正确或上下文无效,此方法将失败。
请注意,Swift编译器并不总能给出确切的原因。可能是调用函数传递了无效的articleID
。
此外,您发布的代码存在严重缺陷。您的init方法意味着托管对象上下文是在其他地方创建的,并且该类需要使用有效的上下文进行初始化。这似乎是提供托管对象上下文的一种非常麻烦的方式。您继续忽略它并使用应用程序委托中的其他上下文。
此外,您的类名看起来非常像一个方法。这应该是什么类?按照惯例,课程应以大写字母开头。