2010-12-10 6 views
1

J'ai un problème avec certains objets de données de base qui sont en quelque sorte invalidés. Le contexte d'objet géré se trouve dans le délégué de l'application et je l'utilise dans une table de vue pour extraire des objets 'notes' d'une base de données et les afficher. Je construis un tableau pour les sections (aujourd'hui, hier, etc.) et pour chaque section un tableau avec les notes dans la section comme ceci:L'objet Données de base est invalidé

// in the .h file 
NSMutableArray* data; // An array containing an array of thoughts for each section. 
@property (nonatomic, retain, readonly) NSManagedObjectContext* objectContext; 

// in the .m file, when loading the view 
ThoughtsAppDelegate* appDelegate = (ThoughtsAppDelegate*)[[UIApplication sharedApplication] delegate]; 
objectContext = appDelegate.managedObjectContext; 

NSEntityDescription* descriptor = [[NSEntityDescription entityForName:@"Note"      
            inManagedObjectContext:objectContext] autorelease]; 
NSFetchRequest* request = [[NSFetchRequest alloc] init]; 
[request setEntity:descriptor]; 
NSError* error; 
NSArray* notes = [objectContext executeFetchRequest:request error:&error]; 
// example for one section 
data = [[NSMutableArray alloc] init]; 
NSMutableArray* ccurrentSection = [[NSMutableArray alloc] init]; 
[data addObject:currentSection]; 
for(Note* t in notes) 
    [currentSection addObject:t]; 

Lorsque la vue charge les 5 premières notes sont affichées (le le repos ne rentre pas dans la vue) et tout est OK. Mais quand je défiler vers le bas pour afficher les notes suivantes, je reçois un

NSObjectInaccessibleException Le NSManagedObject avec ID ... a été invalidée.

Cela se produit pour tous les objets de la matrice.

Comment est-ce possible? J'ai vérifié et ne réinitialise/libère pas le contexte. Ou est-ce mauvais de stocker un objet de données de base et s'y référer plus tard? Edit: cela semble se produire également si je ne défile pas et que je veux afficher des détails sur une note quand elle est sélectionnée. Il semble que dès que les premières notes sont affichées, elles sont invalidées.

+0

Avez-vous besoin de conserver votre managedObjectContext ou est-ce fait à l'intérieur de votre application deleagate - si le contexte de votre objet géré disparaît, cela peut provoquer cette erreur. – deanWombourne

+0

Dans le délégué de l'application, j'ai la propriété créée automatiquement par Xcode: @property (nonatomic, retain, readonly) NSManagedObjectContext * managedObjectContext; il devrait donc être conservé. Je ne le libère nulle part et je n'apporte aucune modification à la base de données. –

Répondre

1

Il semble que ce soit quelque chose avec la façon dont vous gérez les objets notes, mais le code qui fait cela n'est pas dans votre exemple. Le tableau de notes est un tableau autorelease donc à moins que vous ne le conserviez quelque part, il peut être libéré avant que vous chargiez la section suivante.

+0

Une 'note' est ajoutée au tableau 'section', et le 'tableau' section 'est ajouté au tableau' data '(qui est conservé) ... la note ne devrait donc pas être conservée? –

+0

Oups désolé. Missed that :-) – drekka

+0

Quand ce code est-il exécuté? – drekka

Questions connexes