同时从表视图行和核心数据中删除项目
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
。如果不更全面地了解您的视图控制器是如何工作的,就不可能确切地说出您将如何做到这一点,但有几件事是明确的:
您方法中的前三行没有做任何有用的事情。削减它们——即使你让它们起作用,它们在这里也是错误的方法。您不希望必须 获取 您正在此处删除的托管对象。当您到达此方法时,您应该已经足够了解如何删除它了。
不需要使用NSFetchedResultsController
将核心数据与table视图放在一起。但如果您是编程新手,您可能会发现使用它会容易得多。
我正在尝试从 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
。如果不更全面地了解您的视图控制器是如何工作的,就不可能确切地说出您将如何做到这一点,但有几件事是明确的:
您方法中的前三行没有做任何有用的事情。削减它们——即使你让它们起作用,它们在这里也是错误的方法。您不希望必须 获取 您正在此处删除的托管对象。当您到达此方法时,您应该已经足够了解如何删除它了。
不需要使用
NSFetchedResultsController
将核心数据与table视图放在一起。但如果您是编程新手,您可能会发现使用它会容易得多。