[英]How do I delete an object for CoreData in Swift 4
So I've written some code to read information from CoreData.所以我写了一些代码来从 CoreData 读取信息。
func getData() {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
// let newSitting = NSEntityDescription.insertNewObject(forEntityName: "Sittings", into: context)
//get data from CoreData
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Sittings")
request.returnsObjectsAsFaults = false
do {
let results = try context.fetch(request)
if results.count > 0 {
for result in results as! [NSManagedObject] {
if let sittingDate = result.value(forKey: "date") as? Date {
//add data to array
sittingsDatesArr.append(sittingDate)
}
}
}
else {
print ("database is empty")
}
}
catch {
print ("error")
}
}
And write data to CoreData,并将数据写入 CoreData,
func writeData(sitDate: Date) {
// setup CoreData
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
let newSitting = NSEntityDescription.insertNewObject(forEntityName: "Sittings", into: context)
newSitting.setValue(sitDate, forKey: "date")
do {
try context.save()
print ("-----SAVED-----")
}
catch {
print ("XXXXX THERE WAS AN ERROR XXXXXXX")
}
}
and all that seem to work OK.所有这些似乎都可以正常工作。
But I can't seem to work out how to delete an entry when the user slides to delete the row in the UITableView.但是当用户滑动以删除 UITableView 中的行时,我似乎无法弄清楚如何删除条目。 So far I have this,
到目前为止,我有这个,
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if (editingStyle == UITableViewCellEditingStyle.delete) {
dateFormatter.dateStyle = .long
dateFormatter.timeStyle = .long
// remove item from array
sittingsDatesArr.remove(at: indexPath.row)
// remove item from core data
//refresh
refresh()
}
}
For reference, this is the refresh function,作为参考,这是刷新功能,
@objc func refresh(){
getData()
print("refreshed")
viewTable.reloadData()
}
if you want to remove a single object from your coredata try this code如果您想从核心数据中删除单个对象,请尝试使用此代码
let request = NSFetchRequest(entityName: "Person")
request.predicate = NSPredicate(format:"markedCell = %@", "Test")
if let results = context.executeFetchRequest(request, error: nil) as? [NSManagedObject] {
// Delete _all_ objects:
for object in results {
context.deleteObject(object)
}
// Or delete first object:
if results.count > 0 {
context.deleteObject(results[0])
}
} else {
// ... fetch failed, report error
}
if you want to remove all object from your core data try this如果您想从核心数据中删除所有对象,请尝试此操作
func deleteData(data : String) {
// data is entity name
let moc = getContext()
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: data)
if let result = try? moc.fetch(fetchRequest){
for object in result {
moc.delete(object as! NSManagedObject)
}
}
do{
try moc.save()
print("saved")
}catch let error as NSError {
print("Could not save \(error), \(error.userInfo)")
}
}
So I ended up having to do this:所以我最终不得不这样做:
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if (editingStyle == UITableViewCellEditingStyle.delete) {
dateFormatter.dateStyle = .long
dateFormatter.timeStyle = .long
let date = sittingsDatesArr[indexPath.row]
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Sittings")
request.predicate = NSPredicate(format:"date = %@", date as CVarArg)
let result = try? context.fetch(request)
let resultData = result as! [NSManagedObject]
for object in resultData {
context.delete(object)
}
do {
try context.save()
print("TABLEVIEW-EDIT: saved!")
} catch let error as NSError {
print("Could not save \(error), \(error.userInfo)")
} catch {
// add general error handle here
}
//refresh
refresh()
}
}
seems to work, although its a bit slow to refresh the UITableView, working on that now.似乎工作,虽然刷新 UITableView 有点慢,现在正在处理。
Did you try this?你试过这个吗? Swift 3 Core Data Delete Object
Swift 3 核心数据删除对象
All you have to do is delete the object and save the changes.您所要做的就是删除对象并保存更改。
PersistenceManager.swift持久化管理器.swift
import CoreData
class PersistenceManager {
static var shared: PersistenceManager = PersistenceManager()
var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "Name")
container.loadPersistentStores(completionHandler: { (_, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
var context: NSManagedObjectContext {
return self.persistentContainer.viewContext
}
func fetch<T: NSManagedObject>(request: NSFetchRequest<T>) -> [T] {
do {
let fetchResult = try self.context.fetch(request)
return fetchResult
} catch {
print(error.localizedDescription)
return []
}
}
@discardableResult
func delete(object: NSManagedObject) -> Bool {
self.context.delete(object)
do {
try self.context.save()
return true
} catch {
return false
}
}
}
Delete data (ViewController)删除数据(视图控制器)
let request = NSFetchRequest<NSManagedObject>(entityName: "Name")
var dataArray: [NSManagedObject] = []
//CoreData - Fetch
recentCompany = PersistenceManager.shared.fetch(request: request)
//CoreData - Delete
guard let value = self?.dataArray[indexPath.row] else { return }
PersistenceManager.shared.delete(object: value)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.