[CoreData] Supprimer un objet d'un array

Bonjour,

J’ai commencé le cour sur coreData, bien que je n’ai pas encore tout bien compris j’ai essayer de le prendre en main pour un petit projet personnel.

En gros je sauve des objets dans un array mais je ne parviens pas du tout à supprimer ceux-ci et j’avoue ne pas savoir quoi faire …

J’ai utilisé le même code que @mbritto pour mettre à jour le toggle d’une tache pensant que ça marcherais de même pour une suppression mais pas du tout …

Une idée pour régler ça ?

Merci beaucoup !

As-tu essayé de créer un nouveau tableau avec un .filter ne retenant que les éléments différents de l’id à effacer ?

1 « J'aime »

Bonjour,
Je suis un peu dans le même cas que toi et j’essaye de me faire une petite application perso un peu plus compliquée que l’exemple de Maxime pour me faire la main.
Je rencontre quelques difficultés mais par contre j’avais réussi à faire cette suppression.
Au vu de ton code, j’ai l’impression que la suppression dans le tableau local fonctionne, mais que c’est la suppression dans la BDD CoreData qui ne fonctionne pas. C’est ça?
A+
Pascal

1 « J'aime »

C’est exactement ça que il ce passe en effet !

Je n’avais pas pensé à cette possibilité. Je m’y attaque tout de suite !

Il est bizarre ton code ! Tu effaces l’objet du tableau à un index donné et ENSUITE tu demandes à CoreData de mettre à jour l’objet avec le même index.

Dans ce cas, voici ce que j’ai fait:
Dans le management:

func deleteArticle (withId articleId:UUID) {
    if let indexArticle = groceryList.firstIndex(where: { (article) -> Bool in
        article.id == articleId
    }) {
        print ("ListManagement.deleteArticle id=\(articleId) indexArticle=\(indexArticle)")
        print ("deleteArticle \(groceryList [indexArticle].articleName)")
        groceryList.remove (at: indexArticle)
        storage.deleteArticle(withId: articleId)
    }
    else {
        print ("ListManagement.deleteArticle id=\(articleId) not found")
    }
}

et dans storage
func deleteArticle (withId id:UUID){
if let articleFounded = fetchCDArticleFromId(withId: id) {
print (« article trouvé : (articleFounded.articleName ?? « inconnu ») »)
self.context.delete(articleFounded)
saveDataInCoreData()
} else {
print (« pas trouvé id=(id) »)
}
}

J’espère que ça marchera
A+
Pascal

1 « J'aime »

Oui, je pensais que en fessant ça la base de donnée remarquerais que l’élément du tableau avait été supprimé et donc l’enlèverait.

Mais comme tu l’as fait remarqué ce que je pensais ne tient pas la route.

J’essaye tout de suite !

Bordel ça a marché !!

La solution était si évidente, j’aurais du me douter de l’existence d’une option .delete dans coreData.

Un tout grand merci !

Merci aussi à toi @Draken l’option .filter marche aussi dans ce que j’en ai lu sur internet (je ne sais juste pas encore l’utiliser je dois revoir la base de Swift je pense).

Pas de quoi. C’est vrai que la doc est mal foutue. J’ai trouvé cette solution sur un site en Anglais.
A bientôt sans doute.
Pascal

2 « J'aime »

Bonjour, je relance le sujet légèrement différemment:

– J’ai ma struct :

struct Cellule: Identifiable {

var id = UUID()

let valeur:String

let date:String

}

– J’utilise une liste pour afficher mes éléments d’un array :

List {
ForEach(cellManager.arrayCellule) { cell in
HStack {
Text("(cell.valeur)" + " €")
.font(.title)
.baselineOffset(20.0)
.padding()
Spacer()
Text("(cell.date)")
.font(.subheadline)
.baselineOffset(0)
.padding()
}
}
.onDelete(perform: { indexSet in
** cellManager.arrayCellule.remove(atOffsets: indexSet)**

            // C'est ici que je bug
            
        })
    }

Le problème c’est que lorsque je supprimer une ligne de mon foreach avec le .onDelete, je supprime un index de mon array, mais je n’arrive pas a faire le lien avec coreData.
Je pars du principe que je dois trouver une Cellule() à partir du même index mais la c’est le drame je n’y arrive pas.
Si quelqu’un aurait une solution à me proposer je serai preneur :sweat_smile:
Merci à vous.

Salut, par hasard tu saurais faire un imprimer écrans de ton code et de ton lien avec coreData ? Comme ça c’est un peu flou pour moi :slight_smile:

Salut, c’est ce que je voulais faire mais non aucune idée de comment insérer le code proprement de manière à ce que d’autres personnes puissent y toucher… :sweat:

Ou alors tu fais une capture de ton écrans ?

Comme ça nous voyons ton code tel que il est, personne ne peut y toucher et si tu souhaites ne pas montrer certaines parties tu peux le flouter :slight_smile:

Voila les captures,
C’est au niveau du .onDelete qui est dans ma liste que j’ajoute ma fonction du manager, et où j’aimerai réussir a récupérer mon objet pour le retirer de CoreData
et sinon au contraire j’aimerai bien savoir insérer le code proprement, pas de soucis que l’on puisse toucher à mon code au contraire :wink:

Malheureusement pour régler ce problème je ne sais pas t’aider …

J’ai été confronté à ce genre de problème et j’ai du faire autrement pour supprimer une tache (mais sans le .onDelete)

Ceci dit je te redirige vers cette vidéo qui utilise CoreData et le .onDelete mais c’est une méthode très différente de ce quoi nous avons appris dans le cour de Maxime à toi de voir ce que tu préfères utiliser

Merci à toi je vais aller regarder ça.

Bonjour,
Je n’ai pas le temps de faire une réponse détaillée, mais en gros voici comment j’ai procédé pour réaliser ça:

  • j’ai un id (UUID) qui permet de faire le lien entre le tableau local et l’objet dans coreData
  • quand je veux supprimer un élément du tableau, je fais un fetch avec l’id dans coreData pour récupérer l’objet coreData et je fais self.context.delete (objetCD)
  • je fais le remove dans le tableau local.
    Si tu veux plus de détails, demande moi et je t’enverrai du code.
    Bonne soirée
    Pascal

Bonjour à nouveau. Je viens de réaliser que je n’ai pas vu une partie de ton code qui fait exactement ce que je te disais. Du coup ce que j’ai dit ne sert à rien. Par contre chez moi ça fonctionne. Pas chez toi?? Tu as un message d’erreur ou un log ?