Bonjour,
Soit le data model suivant, pour schématiser: 2 entities en relation parent/enfant "to-many" dans une base de données SQLite gérée avec Core Data. Les entités contiennent des attributs de type NSDecimalNumber.
L'entité enfant s'appelle Ordercontent et contient les attributs suivants:
- childValue1
- childValue2
- childTotal (egal a 'childValue1' multiplie par 'childValue2')
- une relation appelee ‘order’ vers le parent
L'entite parent s'appelle Order et contient l'attribut suivant:
- parentTotal (egal a la somme des childTotal des enfants)
- une relation appelee ‘content’ vers l’enfant
Quand on supprime un parent (objet Order), les enfants éventuels sont supprimes aussi, par suppression en cascade.
PROBLEME:
Quand on supprime un parent (peu importe qu'il contienne des enfants ou non), l'objet est supprime mais l'application se plante avec les messages suivants:
1. CoreData: warning: An NSManagedObjectContext delegate overrode fault handling behavior to silently delete the object with ID '0x80002b <x-coredata://7F7D281F-5381-49A2-80B3-CE08A250E752/Order/p2 <x-coredata://7F7D281F-5381-49A2-80B3-CE08A250E752/Order/p2>>' and substitute nil/0 for all property values instead of throwing.
2. CoreData: error: Mutating a managed object 0x80002b <x-coredata://7F7D281F-5381-49A2-80B3-CE08A250E752/Order/p2 <x-coredata://7F7D281F-5381-49A2-80B3-CE08A250E752/Order/p2>> (0x6080000c9f40) after it has been removed from its context.
Le premier message est du a un manque de gestion d’erreur dans le cas ou une certaine valeur est nil, mais la remediation a cela ne règle pas le problème dans son ensemble.
Deuxième -> Je ne vois pourtant pas, dans les classes ManagedObject, quel code tente de modifier l’objet après sa suppression.
Le problème de plantage disparait quand je retire du code tout ce qui concerne KVO (startObserving, stopObserving), méthodes qui furent nécessaires pour que la valeur parentTotal se mette a jour correctement en fonction des changements des enfants.
Sans l’attirail KVO, la valeur parentTotal n’est pas mise a jour lorsqu’on SUPPRIME un enfant. Par contre, elle est correctement mise a jour lorsqu’on AJOUTE ou qu’on MODIFIE un enfant.
A l’origine, le problème vient sans doute d’une mauvaise definition des getters et setters. En effet, ceux-ci ne sont pas définis complètement et la repercussion correcte des valeurs s’obtient surtout par appel a des fonctions contenant des ‘setValue_forKey’ par KVC dans le code de mes classes ManagedObject.
Avec Core Data, ceci n’est pas la meilleure façon de travailler. Je supprime donc tout ce qui est KVO, fonctions et KVC. Je suis en train de redéfinir correctement tous les getters et setters requis. J"ai termine pour l'entité enfant Ordercontent et ca marche très bien, mais pas encore fini avec le parent Order.
Certains d’entre vous auront peut-être une suggestion…
Soit le data model suivant, pour schématiser: 2 entities en relation parent/enfant "to-many" dans une base de données SQLite gérée avec Core Data. Les entités contiennent des attributs de type NSDecimalNumber.
L'entité enfant s'appelle Ordercontent et contient les attributs suivants:
- childValue1
- childValue2
- childTotal (egal a 'childValue1' multiplie par 'childValue2')
- une relation appelee ‘order’ vers le parent
L'entite parent s'appelle Order et contient l'attribut suivant:
- parentTotal (egal a la somme des childTotal des enfants)
- une relation appelee ‘content’ vers l’enfant
Quand on supprime un parent (objet Order), les enfants éventuels sont supprimes aussi, par suppression en cascade.
PROBLEME:
Quand on supprime un parent (peu importe qu'il contienne des enfants ou non), l'objet est supprime mais l'application se plante avec les messages suivants:
1. CoreData: warning: An NSManagedObjectContext delegate overrode fault handling behavior to silently delete the object with ID '0x80002b <x-coredata://7F7D281F-5381-49A2-80B3-CE08A250E752/Order/p2 <x-coredata://7F7D281F-5381-49A2-80B3-CE08A250E752/Order/p2>>' and substitute nil/0 for all property values instead of throwing.
2. CoreData: error: Mutating a managed object 0x80002b <x-coredata://7F7D281F-5381-49A2-80B3-CE08A250E752/Order/p2 <x-coredata://7F7D281F-5381-49A2-80B3-CE08A250E752/Order/p2>> (0x6080000c9f40) after it has been removed from its context.
Le premier message est du a un manque de gestion d’erreur dans le cas ou une certaine valeur est nil, mais la remediation a cela ne règle pas le problème dans son ensemble.
Deuxième -> Je ne vois pourtant pas, dans les classes ManagedObject, quel code tente de modifier l’objet après sa suppression.
Le problème de plantage disparait quand je retire du code tout ce qui concerne KVO (startObserving, stopObserving), méthodes qui furent nécessaires pour que la valeur parentTotal se mette a jour correctement en fonction des changements des enfants.
Sans l’attirail KVO, la valeur parentTotal n’est pas mise a jour lorsqu’on SUPPRIME un enfant. Par contre, elle est correctement mise a jour lorsqu’on AJOUTE ou qu’on MODIFIE un enfant.
A l’origine, le problème vient sans doute d’une mauvaise definition des getters et setters. En effet, ceux-ci ne sont pas définis complètement et la repercussion correcte des valeurs s’obtient surtout par appel a des fonctions contenant des ‘setValue_forKey’ par KVC dans le code de mes classes ManagedObject.
Avec Core Data, ceci n’est pas la meilleure façon de travailler. Je supprime donc tout ce qui est KVO, fonctions et KVC. Je suis en train de redéfinir correctement tous les getters et setters requis. J"ai termine pour l'entité enfant Ordercontent et ca marche très bien, mais pas encore fini avec le parent Order.
Certains d’entre vous auront peut-être une suggestion…