De ce avem nevoie pentru a apela context.ștergere pentru a șterge un element din NSManagedObject matrice?

0

Problema

Să presupunem că am;

var itemArray = [Item]()

și este un Element de NSManagedObject. Elementul are două atribute "Title":String și "Făcut":Boolean. Aici e poza mea de model de date.

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 {

 }

Când m-am schimba valoarea de Făcut și apel context.salva, este automat reflectată Persistente Container. Cu toate acestea, atunci când am elimina un element din matrice prin a spune,

itemArray.remove(at: someindex)

și sună context.salva. Elementul nu este șters din Persistente Container. Numai dacă te-am sunat,

context.delete(itemArray[someindex])

atunci elementul este cu adevărat șterse din magazin.

Deci, de ce numai scoaterea din itemArray și de a salva context nu este suficientă deși a schimba un atribut valoare și de a salva context este suficientă pentru succes CRUD funcționare pe Bază de Date?

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

Cel mai bun răspuns

1

Atunci când modificați un atribut pe un Element obiect de Bază de Date (de fapt NSManagedObjectContext) detectează că deoarece Elementul aparține NSManagedObjectContext și elementul este marcat la fel de murdar. Dar tabloul are nici o legătură cu NSManagedObjectContext în orice mod, astfel încât orice modificări pe care le face pentru a rămâne nedetectate prin NSManagedObjectContext și că este de ce aveți nevoie pentru a spune în mod explicit că doriți să ștergeți elementul eliminat din matrice.

Un alt mod de a privi lucrurile este că orice ai crea/defini în Core model de Date este cunoscut de către NSManagedObjectContext dar ceva l-a creat în afara în codul swift este necunoscut. Dacă vei începe să lucrezi cu multe relații între entități, veți vedea că atunci adăugarea sau eliminarea de obiecte de la-mai-mulți colectare vor fi gestionate direct de către NSManagedObjectContext într-un fel v-ați așteptat pentru matrice.

2021-11-24 12:13:31
1

Matrice var itemArray = [Item]() nu are legătură directă cu baza de date. Prin urmare, eliminarea de elemente din matrice care nu afectează Datele de Bază de date.

Pentru a crea, salva sau șterge NSManagedObject cazuri într-o Bază de Date bază de date aveți nevoie pentru a apela funcții legate de un valabile NSManagedObjectContext.

2021-11-23 13:15:17
1

Orice operațiune pe CoreData ar trebui să fie făcut prin NSManagedObjectContext ca e ciorna pentru a accesa sau de a actualiza orice entitate în baza de date. Deci, în cazul dumneavoastră în timp ce ștergerea Item entitate, ar trebui să faci asta prin context doar pentru a fi reflectate în baza de date.

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

Mă întrebam despre ce update apela direct reflectate pe CoreData de bază.
Akif

În alte limbi

Această pagină este în alte limbi

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