Dlaczego musimy wywołać context.delete, aby usunąć element z tablicy NSManagedObject?

0

Pytanie

Załóżmy, że mam;

var itemArray = [Item]()

i element jest obiektem NSManagedObject. Element posiada dwa atrybut "Tytuł":Wiersz i "Gotowe":wartość Logiczna. Oto zdjęcie mojego modelu danych.

enter image description here

//  Item+CoreDataClass.swift

//  This file was automatically generated and should not be edited.
//

 import Foundation
 import CoreData

 public class Item: NSManagedObject {

 }

Kiedy mogę zmienić wartość Gotowe i wzywam context.save, to automatycznie odbija się w Ciągłym pojemniku. Jednak, gdy usuwam element z tablicy, mówiąc,

itemArray.remove(at: someindex)

i przywołaj kontekst.zapisz. Element nie jest usuwany ze stałego pojemnika. Tylko jeśli zadzwonię,

context.delete(itemArray[someindex])

wtedy towar naprawdę zostanie usunięty ze sklepu.

Więc dlaczego nie wystarczy tylko usunąć z itemArray i zapisz kontekst, chociaż dla udanej pracy z podstawowymi danymi wystarczy zmienić wartość atrybutu i zapisz kontekst?

core-data ios swift
2021-11-23 12:52:23
3

Najlepsza odpowiedź

1

Po zmianie atrybutu elementu Podstawowe dane (właściwie NSManagedObjectContext) odkrywają, że, ponieważ element należy do NSManagedObjectContext, i element oznaczony jako brudny. Ale twój szyk w żaden sposób nie jest związana z NSManagedObjectContext, dlatego wszelkie zmiany w nim wprowadzone, pozostają niezauważone NSManagedObjectContext, i dlatego trzeba wyraźnie powiedzieć mu, że chcesz usunąć element, który trzeba usunąć z tablicy.

Inny sposób na to spojrzeć polega na tym, że wszystko, co tworzysz/określamy w swojej podstawowego modelu danych, wiadomo NSManagedObjectContext, ale wszystko, co zostało stworzone poza swift-kod nieznany. Jeśli zaczniesz pracować z relacji "do wielu" między encjami, zobaczysz, że dodawanie lub usuwanie obiektów z kolekcji "do wielu" będą przetwarzane bezpośrednio NSManagedObjectContext tak, jak można się spodziewać na swojej tablicy.

2021-11-24 12:13:31
1

Tablica var itemArray = [Item]() nie ma bezpośredniego związku z podstawowej bazy danych. Dlatego usuwanie elementów z tablicy nie wpływa na bazę danych podstawowych.

Aby utworzyć, zapisać lub usunąć wystąpienia NSManagedObject w bazie danych podstawowych danych, należy wywołać odpowiednie funkcje dopuszczalnego NSManagedObjectContext.

2021-11-23 13:15:17
1

Każda operacja z CoreData powinny być wykonywane przez NSManagedObjectContext ponieważ jest to notatnik w celu uzyskania dostępu lub aktualizacji każdej encji w bazie danych. Więc w twoim przypadku po usunięciu Item istota, musisz robić to przez kontekst, tylko po to, aby uzyskać odbicie w bazie danych.

var itemArray = [Item]()
let context = //get your context
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Item")
let predicate = NSPredicate(format: " (primaryKey == %@) ", "your_primary_key")
fetchRequest.predicate = predicate
itemArray = try! context.fetch(fetchRequest)
for i in 0 ..< itemArray.count where i < itemArray.count-1 {
    context.delete(itemArray[i])
}

do {
    try context.save()
} catch {
    // print the error
}
2021-11-23 14:54:08

Zastanawiam się, dlaczego połączenie aktualizacji bezpośrednio odbija się na bazie CoreData.
Akif

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................