CoreData:第 0 行没有现有条目,但第 1、2、3 行没有现有条目

Posted

技术标签:

【中文标题】CoreData:第 0 行没有现有条目,但第 1、2、3 行没有现有条目【英文标题】:CoreData: No existing entry for row 0 but for row 1,2,3 【发布时间】:2015-04-06 19:22:00 【问题描述】:

我制作了一个 CoreData 应用程序,其中还包含一个 UITableView。该应用程序在启动时将所有 CoreData 条目加载到 UITableViewCells 中。我将 5 个条目保存到 CoreData(字符串类型)中。如果每个 UITableViewCell 都将在cellForRowAtIndexPath 处填充正确的条目,则indexPath.row: 0 处没有条目(nil),但在第 1、2、3、4 和 5 行有一个现有条目。我不知道为什么,但每次如果带有indexPath.row = 0 的单元格加载应用程序时崩溃,原因是:fatal error: unexpectedly found nil while unwrapping an Optional valueoptional value 是我的核心数据模型实体的属性。有人知道为什么indexPath.row = 0 每次都会出现这个错误吗?如果您需要更多信息,请随时问我。非常感谢您的帮助。

获取价值:

let object = self.fetchedResultsController.objectAtIndexPath(indexPath) as NSManagedObject
var dateFromCell = object.valueForKey("datum") as NSDate?
var dateString = Date.toString(date: dateFromCell!)

保存价值:

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(myDate, forKey: "datum")

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

【问题讨论】:

在您的数组中的索引0 处,您正在存储一个可选值。如果一个可选项包含一个 nil 值并且你解开它,你的程序将会崩溃。因此出现错误消息unexpectedly found nil while unwrapping an Optional value。在使用可选值之前,使用if let 语法检查可选的内容。 【参考方案1】:

在尝试诊断细胞之前先返回并查看您的阵列。显然,数组中的索引 0 处没有值。放置一个断点并查看您的数组值。如果使用得当,使用可选项将防止崩溃。 (即。??“”或类似的东西)。没有看到您的实际代码就很难诊断,因此请随时分享问题区域。

【讨论】:

我用一些代码更新了这个问题。谢谢你帮助我!【参考方案2】:

如果问题出在代码的那部分,就在这里:

var dateFromCell = object.valueForKey("datum") as NSDate?
var dateString = Date.toString(date: dateFromCell!)
//                                               ^-- Here

dateFromCell 为零。当你强行打开它时会导致崩溃。

这可能是因为您不小心将对象保存到 Core Data 中而没有设置 datum。只有在数据模型编辑器中将datum 属性标记为可选时,这才有可能。

但在开发过程中有时会意外保存未完成的对象。这就是为什么您的代码必须匹配属性配置的原因。您在代码中视为非可选的可选属性是个坏主意。


您应该在数据模型编辑器中将该属性设为非可选,因此如果对象未完全设置,则保存将失败。您将在模型编辑器的属性侧栏中找到该设置。

或者您也必须在代码中将该属性视为可选属性。

即:

if let dateFromCell = object.valueForKey("datum") as? NSDate 
    var dateString = Date.toString(date: dateFromCell!)


【讨论】:

【参考方案3】:

除非您绝对确定它不能为 nil,否则切勿使用 force-unwrap 运算符(感叹号)。

添加强制解包等同于添加NSAssert(myVar != nil)。所以每当你在某处使用感叹号时,你不妨明确地写下断言。至少你会确切地知道你的程序为什么会崩溃。

【讨论】:

以上是关于CoreData:第 0 行没有现有条目,但第 1、2、3 行没有现有条目的主要内容,如果未能解决你的问题,请参考以下文章

查询coreData的fetchrequest

反映 PS 中每个现有记录的 coredata-MO 修改

当我将条目插入现有部分时,为啥我的 UITableView 会为我添加另一个部分?

MFC SetDlgItemText(IDC_EDIT,_T("1")),接下来怎么在第二行显示2,但第一行还是1,不要告诉我那种笨法子!

如何在CoreData中保存多个条目?

为啥 select 语句没有从数据库表中选择所有行?它每次都忽略第一个条目