¿Por qué tenemos que llamar a un contexto.eliminar para eliminar un elemento de NSManagedObject matriz?

0

Pregunta

Supongamos que tengo;

var itemArray = [Item]()

y el Punto es un NSManagedObject. El artículo tiene dos atributos "Title":Cadena y "Hecho":Boolean. Aquí está la foto de mi modelo de datos.

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 {

 }

Cuando cambio el valor de Hacer y contexto de llamada.guardar, automáticamente se refleja a la persistencia del Contenedor. Sin embargo, cuando puedo eliminar un elemento de la matriz diciendo:

itemArray.remove(at: someindex)

y el contexto de llamada.guardar. El elemento no se elimina de la persistencia de Contenedor. Sólo que si me llama,

context.delete(itemArray[someindex])

a continuación, el artículo es realmente eliminado de la tienda.

Entonces, ¿por qué sólo la eliminación de itemArray y guardar contexto no es suficiente, aunque el cambio de un atributo de valor y guardar el contexto es suficiente para el éxito de la operación CRUD en el Núcleo de los Datos?

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

Mejor respuesta

1

Cuando se cambia a un atributo de un Elemento de objeto de Datos Básicos (en realidad el NSManagedObjectContext) detecta que desde el Punto pertenece a la NSManagedObjectContext y el elemento está marcado como sucio. Pero la matriz no tiene ninguna conexión con la NSManagedObjectContext en modo alguno, así que cualquier cambio que haga que pase desapercibido por la NSManagedObjectContext y es por eso que usted necesita decirle explícitamente que desea eliminar el elemento se elimina de la matriz.

Otra manera de ver esto es que cualquier cosa que crear o definir en el Núcleo de su modelo de Datos, es conocido por NSManagedObjectContext pero todo lo que se crea en el exterior en el código swift es desconocido. Si empiezas a trabajar a muchos de relaciones entre las entidades verá que, a continuación, añadir o eliminar objetos de la a-muchos colección será manejado directamente por el NSManagedObjectContext en una forma que usted espera para su matriz.

2021-11-24 12:13:31
1

La matriz var itemArray = [Item]() no tiene relación directa con la base de datos subyacente. Por lo tanto, la eliminación de elementos de la matriz no afecta el Núcleo de la base de Datos.

Para crear, guardar o eliminar NSManagedObject instancias en un Núcleo de Datos de la base de datos que usted necesita para llamar a las funciones relacionadas de una válida NSManagedObjectContext.

2021-11-23 13:15:17
1

Cualquier operación en CoreData debe realizarse a través de NSManagedObjectContext como es el bloc de notas para acceder o actualizar cualquier entidad en la base de datos. Así que, en su caso, mientras que la eliminación de la Item entidad, debe hacerlo a través del contexto sólo se reflejan en la base de datos.

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

Me estoy preguntando acerca de por qué la actualización de la llamada se refleja directamente en CoreData base.
Akif

En otros idiomas

Esta página está en otros idiomas

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