Ios 在NSBatchDeleteRequest之后使用核心数据
在我的应用程序中,当我从web服务刷新实体的内容时,我会删除核心数据中的所有记录并插入所有新记录。但是,很多时候,即使我再次调用上下文,记录也不会从上下文中删除。所以,当我保存时,旧的会保留下来,我只是在现有的基础上叠加,得到大量的副本。我如何才能完全清除上下文,这样我就不必担心重复Ios 在NSBatchDeleteRequest之后使用核心数据,ios,swift,core-data,swift3,Ios,Swift,Core Data,Swift3,在我的应用程序中,当我从web服务刷新实体的内容时,我会删除核心数据中的所有记录并插入所有新记录。但是,很多时候,即使我再次调用上下文,记录也不会从上下文中删除。所以,当我保存时,旧的会保留下来,我只是在现有的基础上叠加,得到大量的副本。我如何才能完全清除上下文,这样我就不必担心重复 var appDelegate = UIApplication.shared.delegate as! AppDelegate var context = appDelegate.persisten
var appDelegate = UIApplication.shared.delegate as! AppDelegate
var context = appDelegate.persistentContainer.viewContext
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "V_ServiceDetails")
// Clear all
let request = NSBatchDeleteRequest(fetchRequest: fetchRequest)
do {
let result = try context.execute(request)
} catch {}
appDelegate = UIApplication.shared.delegate as! AppDelegate
context = appDelegate.persistentContainer.viewContext
// Add new ones
for svc in self.svcs {
let result = NSEntityDescription.insertNewObject(forEntityName: "V_ServiceDetails", into: context)
result.setValue(svc.Car_VIN, forKey: "car_VIN")
result.setValue(svc.Cust_Veh_ID, forKey: "cust_Veh_ID")
do { try context.save() } catch {}
}
var-appDelegate=UIApplication.shared.delegate as!AppDelegate
var context=appDelegate.persistentContainer.viewContext
let fetchRequest=NSFetchRequest(entityName:“V_ServiceDetails”)
//清除所有
let request=NSBatchDeleteRequest(fetchRequest:fetchRequest)
做{
let result=try context.execute(请求)
}捕获{}
appDelegate=UIApplication.shared.delegate as!AppDelegate
context=appDelegate.persistentContainer.viewContext
//添加新的
对于self.svcs中的svc{
让result=NSEntityDescription.insertNewObject(forEntityName:“V_ServiceDetails”,插入:上下文)
结果.设置值(svc.Car\u VIN,forKey:“Car\u VIN”)
result.setValue(svc.Cust\u Veh\u ID,forKey:“Cust\u Veh\u ID”)
执行{try context.save()}捕获{}
}
尝试以下功能:
func deleteAll() {
// Managed Object Context
let managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
// Save the changes of the Managed Object Context before executing the Batch Delete Request
if managedObjectContext.hasChanges {
do {
try managedObjectContext.save()
} catch {
// Error
}
}
// Craete a Fetch Request
let fetchRequest: NSFetchRequest<ManagedObject> = ManagedObject.fetchRequest()
// Initiliaze the Batch Delete Request
let batchDeleteRequest = NSBatchDeleteRequest.init(fetchRequest: fetchRequest as! NSFetchRequest<NSFetchRequestResult>)
// Configure the Batch Delete Request
batchDeleteRequest.resultType = .resultTypeCount
do {
// Execute the Batch Delete Request
try managedObjectContext.execute(batchDeleteRequest)
// Reset the Managed Object Context
managedObjectContext.reset()
// try self.fetchedResultsController.performFetch()
// If you have a Table View? Use this function
// self.tableView.reloadData()
} catch {
// Error
}
}
func deleteAll(){
//托管对象上下文
让managedObjectContext=(UIApplication.shared.delegate为!AppDelegate)。persistentContainer.viewContext
//在执行批删除请求之前保存托管对象上下文的更改
如果managedObjectContext.hasChanges{
做{
请尝试managedObjectContext.save()
}抓住{
//错误
}
}
//CRETE获取请求
let fetchRequest:NSFetchRequest=ManagedObject.fetchRequest()
//初始化批删除请求
让batchDeleteRequest=NSBatchDeleteRequest.init(fetchRequest:FetchRequestAs!NSFetchRequest)
//配置批删除请求
batchDeleteRequest.resultType=.resultTypeCount
做{
//执行批删除请求
尝试managedObjectContext.execute(batchDeleteRequest)
//重置托管对象上下文
managedObjectContext.reset()
//请尝试self.fetchedResultsController.performFetch()
//如果您有表格视图,请使用此功能
//self.tableView.reloadData()
}抓住{
//错误
}
}
从中可以看出,删除是直接在SQL级别完成的。删除的内容不会反映在内存中的对象中,因此需要在删除后更新应用程序。请参阅链接页面上的“执行后更新应用程序”部分。这对我很有效
var e = 1
while e <= self.items!.count {
self.context.delete(self.items![e - 1])
// Save the data
do {
try self.context.save()
}
catch {
}
e = e + 1
}
var e=1
而在您删除上下文中的项之后,e。你能试着保存上下文吗?context.save()
@TheAppMentor我已经将它更新为:do{let result=try context.execute(request)try context.save()}catch{}
,但没有什么区别。