Prečo musíme zavolať kontexte.odstrániť, ak chcete odstrániť položku z NSManagedObject pole?

0

Otázka

Predpokladajme, že mám;

var itemArray = [Item]()

a Položka je NSManagedObject. Položka má dva atribúty, "Title":String a "Hotovo":Boolean. Tu je obraz môjho dátový model.

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 {

 }

Keď som zmeniť hodnotu Hotovo a zavolať kontexte.uložiť, je automaticky prejavia aj na Trvalé Kontajner. Avšak, keď som odobrať prvok z poľa vyslovením

itemArray.remove(at: someindex)

a zavolať kontexte.uložiť. Tovar nie je odstránená z Perzistentné Kontajner. Len vtedy, ak som volal,

context.delete(itemArray[someindex])

položka je skutočne odstránená zo služby obchod.

Tak prečo len odstránenie z itemArray a uložiť kontexte nie je dostatočná, aj keď zmena atribútu " hodnota a uložiť kontexte je dostatočné pre úspešný CRUD prevádzky na Základných Údajov?

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

Najlepšiu odpoveď

1

Pri zmene atribútu na Položku objekt potom Základných Údajov (vlastne NSManagedObjectContext) zistí, že od Položka patrí NSManagedObjectContext a položka je označená ako chybná. Ale vaše pole nemá žiadne pripojenie na NSManagedObjectContext v žiadnom prípade tak všetky zmeny, ktoré urobíte to, aby zostáva nezistený podľa NSManagedObjectContext a to je dôvod, prečo musíte povedať, že je explicitne, ktoré chcete odstrániť položku, ktorú odstráni z poľa.

Ďalší spôsob, ako sa pozrieť na to, že všetko, čo vytvoríte/definovať v vaše Základné Údaje model je známy tým, NSManagedObjectContext ale niečo vytvorili mimo v swift kód je neznámy. Ak začnete pracovať s s mnohými vzťahy medzi subjektami, uvidíte, že potom pridávanie alebo odstraňovanie objektov z to-many zber sa bude nakladať priamo NSManagedObjectContext spôsobom ste očakávali, pre vaše pole.

2021-11-24 12:13:31
1

Pole var itemArray = [Item]() nemá žiadny priamy vzťah s podkladových databázy. Preto odstránenie položky z tohto pole nemá vplyv na Základných Údajov databázy.

Ak chcete vytvoriť, uložiť alebo vymazať NSManagedObject prípadoch v Základných Údajov databázy je potrebné obrátiť sa na príslušné funkcie platný NSManagedObjectContext.

2021-11-23 13:15:17
1

Všetky operácie na CoreData by malo byť vykonané prostredníctvom NSManagedObjectContext ako to je scratchpad na prístup alebo aktualizovať všetky entity v databáze. Takže vo vašom prípade odstránením Item subjekt, mali by ste tak urobiť prostredníctvom kontextu, len aby sa prejaví v 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

Ja som premýšľal o tom, prečo aktualizácia zavolajte priamo odráža na CoreData základňu.
Akif

V iných jazykoch

Táto stránka je v iných jazykoch

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