Proč musíme zavolat kontextu.odstranit chcete-li odstranit položku z NSManagedObject pole?

0

Otázka

Předpokládám, že jsem;

var itemArray = [Item]()

a Položka je NSManagedObject. Položka má dva atributy, "Title":String a "Hotovo":Boolean. Zde je obrázek z mého datového modelu.

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 {

 }

Když jsem změnit hodnotu Hotovo a volání kontextu.uložit, je automaticky odráží Přetrvávající Nádoby. Nicméně, když jsem odstranit prvek z pole tím, že říká,

itemArray.remove(at: someindex)

a volání kontextu.uložit. Položka není odstraněna z Přetrvávající Nádoby. Pouze když jsem volal,

context.delete(itemArray[someindex])

předmět je skutečně odstraněn z obchodu.

Tak proč jen odstranění z itemArray a uložit kontext není dostatečný, i když změna atributu hodnotu' a uložit souvislosti je dostačující pro úspěšné CRUD operace na Core Data?

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

Nejlepší odpověď

1

Při změně atributů na Položku objekt pak Základní Údaje (vlastně NSManagedObjectContext) detekuje, že vzhledem k tomu, Položka patří do NSManagedObjectContext a položka je označena jako špinavé. Ale vaše pole nemá žádný vztah k NSManagedObjectContext v žádném případě, takže veškeré změny, které provedete, aby to zůstává nezjištěný NSManagedObjectContext a to je důvod, proč musíte říct explicitně, že chcete odstranit položku odstraní z pole.

Další způsob, jak se podívat na to je, že něco vytvořit/definovat v Core Data model je známý tím, že NSManagedObjectContext ale něco vytvořil venku v swift kód je neznámý. Pokud začnete pracovat s to-many vztahy mezi subjekty, uvidíte, že pak se přidá nebo odstraní objekty z k-mnoho kolekce budou zpracovány přímo ve NSManagedObjectContext způsobem jste čekali pro vaše pole.

2021-11-24 12:13:31
1

Pole var itemArray = [Item]() nemá žádný přímý vztah s podkladové databáze. Proto odstranění položky z tohoto pole nemá vliv na Základní Údaje databáze.

Vytvořit, uložit nebo odstranit NSManagedObject případech v Základní databáze Údajů, které potřebujete k volání funkce související platné NSManagedObjectContext.

2021-11-23 13:15:17
1

Jakékoliv operace na CoreData by mělo být provedeno prostřednictvím NSManagedObjectContext jak to je zápisníku, aby přístup nebo aktualizovat jakoukoli entitu v databázi. Takže ve vašem případě při odstraňování Item subjekt, měli byste to udělat přes kontextové pouze se odráží na databáze.

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

Já jsem přemýšlel o tom, proč aktualizovat volat přímo odráží na CoreData základnu.
Akif

V jiných jazycích

Tato stránka je v jiných jazycích

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