Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在NSBatchDeleteRequest之后使用核心数据_Ios_Swift_Core Data_Swift3 - Fatal编程技术网

Ios 在NSBatchDeleteRequest之后使用核心数据

Ios 在NSBatchDeleteRequest之后使用核心数据,ios,swift,core-data,swift3,Ios,Swift,Core Data,Swift3,在我的应用程序中,当我从web服务刷新实体的内容时,我会删除核心数据中的所有记录并插入所有新记录。但是,很多时候,即使我再次调用上下文,记录也不会从上下文中删除。所以,当我保存时,旧的会保留下来,我只是在现有的基础上叠加,得到大量的副本。我如何才能完全清除上下文,这样我就不必担心重复 var appDelegate = UIApplication.shared.delegate as! AppDelegate var context = appDelegate.persisten

在我的应用程序中,当我从web服务刷新实体的内容时,我会删除核心数据中的所有记录并插入所有新记录。但是,很多时候,即使我再次调用上下文,记录也不会从上下文中删除。所以,当我保存时,旧的会保留下来,我只是在现有的基础上叠加,得到大量的副本。我如何才能完全清除上下文,这样我就不必担心重复

    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{}
,但没有什么区别。