Pourquoi devons-nous le contexte d'appel.supprimer pour supprimer un élément de NSManagedObject tableau?

0

La question

Supposons que j'ai;

var itemArray = [Item]()

et le Point est un NSManagedObject. Élément possède deux attributs "Title":String et "Fait":Boolean. Voici la photo de mon modèle de données.

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 {

 }

Lorsque je change la valeur de Fait et le contexte d'appel.enregistrer, il est automatiquement répercutée à la persistance d'un Conteneur. Cependant, lorsque je supprime un élément de la matrice en disant:

itemArray.remove(at: someindex)

et le contexte d'appel.enregistrer. L'élément n'est pas supprimé la persistance de Conteneur. Seulement si j'ai appelé,

context.delete(itemArray[someindex])

l'élément est vraiment supprimé à partir de la banque.

Alors pourquoi seulement la suppression de itemArray et enregistrer contexte n'est pas suffisant, bien que la modification d'un attribut de valeur et de sauvegarder le contexte est suffisante pour la réussite de l'opération CRUD sur la Base de Données?

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

La meilleure réponse

1

Lorsque vous modifiez un attribut sur un Élément de l'objet ensuite de Base de Données (en fait la NSManagedObjectContext) détecte qu'étant donné que l'Élément appartient à la NSManagedObjectContext et l'élément est marqué comme sale. Mais votre tableau n'a pas de connexion à la NSManagedObjectContext en aucune façon, de sorte que toute les modifications que vous apportez à reste non détectée par le NSManagedObjectContext et c'est pourquoi vous devez dire explicitement que vous souhaitez supprimer l'élément que vous avez retiré de la baie.

Une autre façon de voir les choses, c'est que tout ce que vous créez/définir dans votre Base de Données modèle est connu par NSManagedObjectContext mais rien créé à l'extérieur dans le code swift est inconnue. Si vous commencez à travailler avec de nombreuses relations entre les entités, vous verrez qu'ensuite, l'ajout ou la suppression d'objets à partir de la collecte de nombreuses seront traitées directement par le NSManagedObjectContext d'une façon qui vous attend pour votre tableau.

2021-11-24 12:13:31
1

Le tableau var itemArray = [Item]() a pas de relation directe avec la base de données. Par conséquent, la suppression d'éléments de ce tableau n'a pas d'incidence sur la Base des Données de la base de données.

Pour créer, enregistrer ou supprimer NSManagedObject cas dans une Base de Données de la base de données, vous devez appeler les fonctions liées à la validité NSManagedObjectContext.

2021-11-23 13:15:17
1

Toute opération sur CoreData devrait être fait par le biais de NSManagedObjectContext comme c'est le pavé de l'accès ou de mise à jour de toute entité dans la base de données. Donc dans votre cas lors de la suppression de la Item entité, vous devez le faire à travers le contexte uniquement pour se reflète sur la base de données.

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

Je me pose des questions sur le pourquoi de la mise à jour de l'appeler directement répercuté sur CoreData de base.
Akif

Dans d'autres langues

Cette page est dans d'autres langues

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