2009-10-15 4 views
2

J'ai une application, en utilisant Core Data avec un magasin SQLite.Cocoa-Touch, Core Data: Comment supprimer tous les objets pour une entité?

À un moment donné, j'aimerais supprimer tous les objets pour quelques entités. Il peut y avoir près de mille objets. D'après ce que je peux dire via google et les documents officiels, la seule façon de supprimer des objets est de [managedObjectContext deleteObject:(Entity *)] pour chaque objet. Mais cela signifie que je dois d'abord aller chercher tous les objets.

Le magasin de données est juste sqlite, n'y a-t-il aucun moyen de lui passer simplement un TRUNCATE TABLE ZENTITY;?

Répondre

4

Le problème est que CoreData n'est pas simplement un wrapper SQLite. C'est une solution de gestion de graphe d'objets et elle stocke des versions en cache de votre objet en mémoire en plus d'autres choses. Autant que je sache pour supprimer toutes les instances d'un objet géré donné, vous devrez les récupérer, puis les supprimer. Cela ne veut pas dire que cette fonctionnalité ne devrait pas exister, car elle devrait probablement.

0

Avez-vous déjà essayé et trouvé que c'était un problème de performance? Si c'est le cas, vous pouvez fournir des informations le montrant, et plus important encore, déposer un rapport de bogue. Si non, alors pourquoi prenez-vous la peine de demander?

Ce n'est pas aussi simple que de faire un TRUNCATE TABLE ZENTITY; puisque les Données de base doivent également appliquer la règle de suppression pour chaque objet (entre autres actions), ce qui signifie effectuer une extraction. Donc, ils peuvent aussi vous permettre de faire la recherche et ensuite passer les résultats dans le contexte un par un.

+0

Je demande parce que je trouve mal à récupérer ~ 1k les lignes d'une base de données lorsque tout ce que vous voulez faire est de les supprimer. Je n'ai pas fait de benchmark pour ça, mais même si Core Data fait un chargement paresseux sur tous les objets, j'aimerais quand même pouvoir faire une troncature sur la table puisque cela ne nécessite même pas de compter en premier. – Prody

+0

Faire des choses encombrantes est toujours une mauvaise solution, peu importe s'il y a un problème de performance. –

+1

Ce n'est pas particulièrement lourd cependant. Il conserve l'API Core Data et indique clairement ce que fait votre code. ** Oui ** s'il y a un problème de performances, c'est mauvais, mais vous devez d'abord mesurer cela. –

9

Si vous associez vos objets à une entité parente, supprimez simplement le parent. Si la règle de suppression de vos parents est définie sur «cascade», tous les enfants (1k) seront également supprimés.

John

+2

Je viens de tomber sur ceci et j'ai l'intention d'utiliser cette approche, mais notez que la règle de cascade s'applique aux relations d'entité. Le statut parent/enfant est utilisé pour créer des sous-types d'entité. –

Questions connexes