使用核心数据获取Nil项导致错误

时间:2016-12-30 04:55:01

标签: ios swift uitableview

我目前正在尝试使用Core Data来获取和添加项目到我的UITableView。提取和添加项目工作正常。然而,问题是当数据什么都没有时,我的获取结果是"致命错误:在展开可选值"时意外地发现nil,这是有道理的,因为我在数据库中没有任何内容。但我没有崩溃,而是想捕获错误并生成UIAlert错误消息而不是崩溃。但我目前的代码似乎不起作用。

func fetch() {
        let itemsFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Items")

        do {
            let fetchedItem = try moc.fetch(itemsFetch) as! [Items]
            self.itemsName.append(fetchedItem.first!.name!)
            self.itemDate.append(fetchedItem.first!.date!)
            self.tableView.reloadData()

            //print(fetchedItem.first!.name!)
            //print(fetchedItem.first!.date!)
        } catch {
            //I thought this statement would catch the error, but it
            // is not doing that 
            print("Hello")
            fatalError("Bad things happened \(error)")
        }
    }

更新 - 我已更新代码以检查nil,但是,我得到:Initialiser for conditional binding must have optional type not NSFetchRequest。不知道如何解决。

func fetch() {
        if let itemsFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Items") {

            do{
                let fetchedItem = try moc.fetch(itemsFetch) as! [Items]
                self.itemsName.append(fetchedItem.first!.name!)
                self.itemDate.append(fetchedItem.first!.date!)
                self.tableView.reloadData()

                //print(fetchedItem.first!.name!)
                //print(fetchedItem.first!.date!)
            } catch {
                print("Hello")
                fatalError("Bad things happened \(error)")
            }
        } else {
            print("Checked")
        }
    }

2 个答案:

答案 0 :(得分:0)

好的我找到了解决方案。这个问题来自do声明。以下是解决问题的方法。

let itemsFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Items")

        do{
           let fetchedItem = try moc.fetch(itemsFetch) as! [Items]
            if fetchedItem.count == 0{
                // Since i casted it to an array of items (my entity), 
                // I can check whether there are no data by checking 
                // if the length of the array is 0
                print("Checked")
            }
            else{
                self.itemsName.append(fetchedItem.first!.name!)
                self.itemDate.append(fetchedItem.first!.date!)
                self.tableView.reloadData()

            }

                //print(fetchedItem.first!.name!)
                //print(fetchedItem.first!.date!)
        } catch {
           print("Hello")
           fatalError("Bad things happened \(error)")
        }

答案 1 :(得分:0)

您也可以使用

 if !(itemsFetch.isEmpty){
}
else{
print("error")
}