Perché abbiamo bisogno di chiamare il contesto.elimina per eliminare un elemento da NSManagedObject array?

0

Domanda

Supponiamo che io sono;

var itemArray = [Item]()

e la Voce è un NSManagedObject. Elemento ha due attributi "Title":Stringa e "Fatto":Boolean. Ecco la foto del mio modello di dati.

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 {

 }

Quando si modifica il valore di Fatto e chiamare il contesto.salva, automaticamente riflessa Persistente Contenitore. Tuttavia, quando ho di rimuovere un elemento dall'array dicendo,

itemArray.remove(at: someindex)

e chiamare il contesto.salva. L'elemento non viene eliminato dalla Persistente Contenitore. Solo se mi chiama,

context.delete(itemArray[someindex])

poi la voce è veramente eliminato dal negozio.

Perché solo la rimozione dal itemArray e salvare contesto non è sufficiente, ma la modifica di un attributo di valore e salvare contesto è sufficiente per il successo di CRUD il funzionamento del Nucleo di Dati?

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

Migliore risposta

1

Quando si modifica di un attributo di un oggetto quindi di Dati di base (in realtà il NSManagedObjectContext) rileva che, poiché l'Elemento appartiene NSManagedObjectContext e l'elemento è contrassegnato come sporco. Ma la matrice non dispone di connessione a NSManagedObjectContext in qualsiasi modo che tutte le modifiche apportate a rimane inosservato dal NSManagedObjectContext e che è il motivo per cui hai bisogno di dire esplicitamente che si desidera eliminare l'elemento rimosso dalla matrice.

Un altro modo di vedere le cose è che nulla si crea/è possibile definire il modello di Dati di base, è noto da NSManagedObjectContext ma nulla creati al di fuori nel codice swift è sconosciuta. Se si inizia a lavorare per molti relazioni tra entità vedrete che poi l'aggiunta o la rimozione di oggetti, per molti di raccolta sarà gestita direttamente dal NSManagedObjectContext in un modo previsto per l'array.

2021-11-24 12:13:31
1

La matrice var itemArray = [Item]() non ha alcuna relazione diretta con il database sottostante. Pertanto, la rimozione di elementi dell'array non influenza i Dati di base database.

Per creare, salvare o eliminare NSManagedObject istanze in un Nucleo di Dati del database è necessario chiamare le relative funzioni di un valido NSManagedObjectContext.

2021-11-23 13:15:17
1

Qualsiasi operazione CoreData dovrebbe essere fatto attraverso NSManagedObjectContext come appunti per l'accesso o l'aggiornamento di qualsiasi entità nel database. Quindi nel tuo caso durante l'eliminazione del Item entità, è necessario farlo attraverso il contesto solo per ottenere riflette sul database.

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

Sto chiedendo il motivo della chiamata di aggiornamento riflette direttamente sul CoreData di base.
Akif

In altre lingue

Questa pagina è in altre lingue

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