2010-12-12 24 views
0

J'utilise CoreData dans une application iOS pour enregistrer une simple liste d'objets de localisation (nom, coordonnées). Je suis tombé deux fois dans une situation, après un avertissement de mémoire, quand les enregistrements de CoreData semblent être corrompus.CoreData: numberOfObjects in Section incorrecte

Plus précisément, (en tableView: numberOfRowsInSection :)

NSUInteger numObjects = [[[fetchedResultsController sections] objectAtIndex:section] numberOfObjects]; 

renvoie 4 pour la section == 0.

Puis (en tableView: cellForRowAtIndexPath :)

aLocation = [fetchedResultsController objectAtIndexPath:indexPath]; 

pour indexPath [ 0,3] génère une exception:

NSRangeException: * - [_ PFArray objectAtIndex:]: index (3) au-delà des limites (3)

Par exemple, CoreData indique qu'il y a 4 lignes dans une table, mais ne peut pas renvoyer un objet pour la dernière ligne lorsque la vue de table le demande il.

Deux questions:

1) Toute pensée sur la façon dont cela pourrait se produire et comment empêcher

2) Une fois qu'il a eu lieu, est-il un moyen pour résoudre le problème de données dans le code?

Merci

Stephen

Répondre

2

La question semble avoir été une certaine incohérence dans le cache CoreData qui a été à l'origine ceci - peu clair ce qui le cause, puisque les prédicats ne sont jamais changés. J'ai fini par appeler deleteCacheWithName si une exception est jamais levée lors de l'accès au dernier objet dans le fetchedResultsController. Cela semble avoir résolu le problème (aucun problème des utilisateurs dans 6 mois à ce sujet).

0

vous avez besoin peut-être de refaire la récupération après la mémoire d'avertissement [fetchedResultsController performFetch] (juste une supposition)

+0

Salut Harald - vous avez peut-être raison, mais la corruption possible n'est apparue qu'après le redémarrage de l'application suite à une exception non gérée. J'ai réussi à contourner l'exception sur l'avertissement de mémoire maintenant (un comportement étrange qui n'affecte que l'iPad 4.2 (pas 3.2), donc pour l'instant ce problème a cessé de se produire.Intéressant, après avoir posté la question, la discordance dans numberOfObjects dans la section était corrigé après avoir effectué une sauvegarde sur NSManagedObjectContext. – StephenT

0

J'ai eu le même problème moi-même. Je n'ai pas eu le temps d'enquêter complètement mais je configurais le FetchController sur un scratch managedObjectContext différent chaque fois que j'appelais à la vue.

La définition de cacheName à zéro m'a permis de résoudre le problème. Ce n'était pas trop un problème de ne pas avoir le cache car la quantité de données était petite.