同时从表视图行和核心数据中删除项目

Delete items from tableview row and core data simultaneously

我正在尝试从 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)

        }
    }

我在最后一行收到警告 "Cast from 'String' to unrelated type 'NSManagedObject' always fails." 有谁知道我该如何解决这个问题?我读过,您可以使用 fetchedResultsController 轻松处理表中的核心数据,但我是编程新手,发现一般设置核心数据时该方法有点混乱。 fetchedResultsController 是管理我的 TableView 中的数据所必需的吗?

尝试在 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)


        }

从你的错误看来 addBook.myBooks 是一个字符串数组。

直接的问题是 deleteObject 不适用于字符串,它适用于托管对象——即 NSManagedObject 的实例或 NSManagedObject 的子类。你不能像那样从 Core Data 中删除一个字符串,你必须删除与该字符串对应的托管对象。该错误专门告诉您 as! NSManagedObject 不适用于字符串,因为字符串与托管对象完全不同。

[你通过removeAtIndex删除了indexPath.row处的字符串,然后又试图使用刚刚删除的indexPath.row处的字符串,这也是一个问题,但是这不是真正的问题。]

您需要做的是找出与您要删除的 table 视图行对应的托管对象,并将其传递给 deleteObject。如果不更全面地了解您的视图控制器是如何工作的,就不可能确切地说出您将如何做到这一点,但有几件事是明确的:

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

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