2012-02-24 1 views
7

Vous avez un Stumper (au moins pour moi). J'utilise iOS 5.0 w/ARC et Core Data dans UIManagedDocument.L'objet géré Données de base ne voit pas les objets associés jusqu'au redémarrage. Simulateur

J'ai une entité (groupe) avec une relation to-many (appelée people) à entity (Person). Lorsque j'ajoute un nouveau groupe et ajoute une nouvelle personne (définissant la relation de groupe de la personne au nouveau groupe), je ne peux pas récupérer les personnes liées en utilisant un prédicat sur l'entité Personne où ("group ==% @", myGroup). J'ai aussi essayé d'utiliser le setPrester du groupe.

Si j'arrête le simulateur XCode et le relance, il reconnaît la relation qui a été créée lors de la précédente exécution, je peux même ajouter de nouvelles personnes à l'objet Groupe existant. Je ne peux simplement pas ajouter un nouveau groupe, puis ajouter des personnes sans arrêter le simulateur (ou l'appareil si je suis en cours d'exécution sur l'appareil) afin de voir la relation.

Si je fais un [nombre de personnes de groupe], immédiatement après avoir ajouté le nouveau groupe et une personne liée, il me donne le nombre correct. Mais un chargement avec un prédicat ne fonctionne pas jusqu'à ce que je redémarre l'application.

Il semble que le managedObjectContext du document UIManagedDocument ne voit pas la relation. J'ai essayé d'enregistrer le contexte, en sauvegardant context.parentContext, et en sauvegardant le document. Rien de tout cela n'a aidé.

Toutes les idées seraient appréciées!

+0

Avez-vous défini la relation inverse dans votre modèle? – Rog

+0

Oui. J'ai un un-à-plusieurs du groupe à la personne, des personnes nommées. Et un inverse un-à-un de personne à groupe, groupe nommé. – Byron

Répondre

10

Un document UIManagedDocument économisera, en fait, quand il en a envie; vous n'avez aucun contrôle sur le moment où cela se produit. Il sera cependant certainement économiser sur la terminaison de l'application, ce qui explique pourquoi vous voyez les insertions lorsque vous redémarrez. Par conséquent, même si vous pensez avoir des ID d'objet permanents, ils sont probablement temporaires et ne peuvent donc pas être récupérés. Le simple fait de les décharger via un NSLog permettrait de le valider, car les identifiants d'objets temporaires apparaissent comme tels lors de la journalisation.

Pour les forcer à être permanentes et donc utilisables, essayez ce qui suit après avoir effectué vos ajouts. En supposant que vous avez un UIManagedDocument comme Ivar:

- (void)performUpdate 
{ 
    NSManagedObjectContext * context = self.managedDocument.managedObjectContext; 
    NSSet     * inserts = [context insertedObjects]; 

    if ([inserts count]) 
    { 
     NSError * error = nil; 

     if ([context obtainPermanentIDsForObjects:[inserts allObjects] 
              error:&error] == NO) 
     { 
      NSLog(@"BAM! %@", error); 
     } 
    } 

    [self.managedDocument updateChangeCount:UIDocumentChangeDone]; 
} 

De toute évidence, vous souhaitez remplacer l'erreur de manipulation avec quelque chose d'un peu mieux ici. Le document UIManagedDocument va maintenant enregistrer à un moment donné dans le futur (encore une fois, vous n'avez absolument aucun contrôle sur le moment où cela se produira, nous le demandons simplement à la dernière ligne, de la même manière qu'un gestionnaire d'annulation le ferait) , mais les objets nouvellement insérés devraient maintenant avoir des identifiants permanents utilisables et les extractions devraient fonctionner correctement.

Et oui, cela me semble un peu étrange, mais cela semble être la bonne façon de faire des choses avec un UIManagedDocument en jeu. Franchement, j'aimerais que quelqu'un me dise que je suis incorrect et que je propose une meilleure solution.

+0

Allan, MERCI !!!Cela m'a coûté de nombreuses heures ou fait tourner mes roues. Comme vous l'avez dit, cela ne semble pas être une étape obligatoire de tous les tutoriels et instructions que j'ai lus, mais cela permet à mon application de fonctionner correctement. – Byron

+0

Si quelqu'un a une idée de la façon dont nous pouvons éviter d'avoir à utiliser cela, je serais ravi de l'entendre aussi. – Byron

+0

Je pense que c'est un peu révélateur qu'il n'y a pas encore de code fourni par Apple pour UIManagedDocument. Je pense que cela peut être un bogue involontaire introduit à la suite des nouveaux contextes d'objets gérés imbriqués, et ils attendent de le réparer avant de fournir un exemple de code. La théorie d'un nerd, de toute façon. –

-1

J'avais un problème similaire, la mise à jour ne m'a pas aidé. Cela a fait:

NSArray *insertedObjs = [[self.managedObjectContext insertedObjects] allObjects]; 
if ([insertedObjs count] > 0) { 
    NSError * error; 
    [self.managedObjectContext obtainPermanentIDsForObjects:insertedObjs error:&error]; 
} 

Je l'exécute après avoir inséré les objets et avant que je l'ai enregistré.

Questions connexes