同时从tableview行和核心数据中删除项目

时间:2015-07-20 22:35:59

标签: ios iphone swift xcode6

我试图从TableView和名为" Books。"的实体中删除项目。但是,我不知道我是否在正确的轨道上。当我尝试这段代码时:

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {

        var appdel:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        var context:NSManagedObjectContext = appdel.managedObjectContext!
        var request = NSFetchRequest(entityName: "Books")

        if editingStyle == UITableViewCellEditingStyle.Delete {

            addBook.myBooks.removeAtIndex(indexPath.row)
            tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
            context.deleteObject(addBook.myBooks[indexPath.row] as! NSManagedObject)

        }
    }

我在最后一行上收到警告,说出"来自' String'不相关的类型&#NS; NSManagedObject'总是失败。"有谁知道我怎么能解决这个问题?我已经读过你可以使用fetchedResultsController轻松处理表中的核心数据,但我是编程新手,发现这种方法在设置核心数据时更加困惑。是否需要fetchedResultsController来管理我的TableView中的数据?

2 个答案:

答案 0 :(得分:2)

从您的错误中可以看出addBook.myBooks是一个字符串数组。

当前的问题是deleteObject不适用于字符串,它适用于托管对象 - 即NSManagedObject的实例或NSManagedObject的子类。您无法从Core Data中删除字符串,您必须删除与该字符串对应的托管对象。该错误特别告诉您as! NSManagedObject对字符串不起作用,因为字符串与托管对象完全不同。

[问题是您要通过indexPath.row删除removeAtIndex处的字符串,然后尝试使用您刚删除的indexPath.row处的字符串,但这不是真正的问题在这里。]

您需要做的是找出与您要删除的表视图行对应的托管对象,并将其传递给deleteObject。如果没有关于视图控制器如何工作的更全面的图片,就不可能准确地说出你将如何做到这一点,但有一些事情是明确的:

  1. 您方法中的前三行没有做任何有用的事情。削减他们 - 即使你让他们工作,他们在这里是错误的方法。您不希望在此处获取您要删除的托管对象。当您达到此方法时,您应该已经足够了解它。

  2. 使用NSFetchedResultsController将核心数据与表格视图放在一起不是必要。但如果你是编程新手,如果你使用它,你可能会发现事情要容易得多。

答案 1 :(得分:0)

尝试在deleteObject

之后保存上下文
context.deleteObject(addBook.myBooks![indexPath.row])
            addBook.myBooks.removeAtIndex(indexPath.row)

            do {
                try context.save()
            }
            catch {
                print("Error")
            }

            self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)


        }