Как я могу удалить данные в coreData и Tableview с помощью одной кнопки? - PullRequest
0 голосов
/ 05 июня 2019

На самом деле я делаю приложение для рецепта, я уже сделал постоянные данные, чтобы сохранить свои ингредиенты в списке, но когда я хочу удалить свои ингредиенты с помощью кнопки, это работает в первый раз, но возвращаюсь, когда я перезагружаю свойприложение.

Вот мой код:

class AddIngredientController: UIViewController, ShowAlert {

    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var ingredientsTableView: UITableView!

    var itemArrayIngredient = [Item]()

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    override func viewDidLoad() {
        super.viewDidLoad()
        let dataFilePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        print(dataFilePath)
        loadItems()
    }

    func saveItems() {
        do {
            try context.save()
        } catch {
            print("Error saving context \(error)")
        }
    }

    func loadItems(with request: NSFetchRequest<Item> = Item.fetchRequest()) {
        do {
            itemArrayIngredient = try context.fetch(request)
        } catch {
            print("Error fetching data from context \(error)")
        }
    }

    @IBAction func clearButton(_ sender: UIButton) {
        context.delete() //Here the problem
        itemArrayIngredient.removeAll()
        saveItems()
        ingredientsTableView.reloadData()
    }

    @IBAction func addButton(_ sender: UIButton) {
        if textField.text!.isEmpty {
            showAlert(title: "No Ingredients", message: "Please, add some ingredients to your list.")
        } else {
            newIngredientAdded()
        }
    }

    func newIngredientAdded() {
        let newItem = Item(context: context)
        newItem.title = textField.text!
        itemArrayIngredient.append(newItem)
        saveItems()
        ingredientsTableView.reloadData()
        textField.text! = ""
    }
}

extension AddIngredientController: UITableViewDataSource, UITableViewDelegate {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return itemArrayIngredient.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "customSearchCell", for: indexPath)
        let item = itemArrayIngredient[indexPath.row]
        cell.textLabel?.text = item.title
        cell.textLabel?.textColor = UIColor.white
        cell.textLabel?.font = UIFont(name: "Marker Felt", size: 19)
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        saveItems()
        tableView.deselectRow(at: indexPath, animated: true)
    }
}

Ответы [ 3 ]

0 голосов
/ 05 июня 2019

Вы можете удалить все данные из определенной сущности, используя NSBatchDeleteRequest. Смотрите следующий код. Основное преимущество NSBatchDeleteRequest в том, что вам не нужно перечислять массив объектов.

let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: "EntityName")
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetch)

do {
    try context.execute(deleteRequest)
} catch {
    print(error.localizedDescription)
}
0 голосов
/ 05 июня 2019

context.delete должен вызываться с аргументом. Например

@IBAction func clearButton(_ sender: UIButton) {
    itemArrayIngredient.forEach { context.delete($0) }
    itemArrayIngredient.removeAll()
    saveItems()
    ingredientsTableView.reloadData()
}
0 голосов
/ 05 июня 2019

Вам необходимо удалить конкретный объект из основных данных.Пожалуйста, обратитесь ниже код

let fetchRequest = NSFetchRequest(entityName: "EntityName")

if let result = try? context.fetch(fetchRequest) {
    for object in result {
        //Please check before delete operation
        if object.id == Your_Deleted_Object_ID{
            context.delete(object)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...