Question

J'ai le problème suivant:

J'ai une application avec un UITableView comme vue racine. Dans ce tableView sont différentes entrées et ajouter également PersistentStore à mon application pour chaque entrée (qui peut être créé par l'utilisateur).

Alors, quand je commence l'application à partir de zéro (pas les données enregistrées, etc.) et ajoutez une entrée, le PersistentStore est également créé et quand je clique sur le tableViewCell, je peux enregistrer des données dans ce produit PersistentStore. Cela fonctionne bien si je crée une entrée et regarder également l'entrée au cours d'une seule opération.

et

Si je ferme l'application et recommencer, cliquez sur la même entrée, je reçois le message d'erreur suivant:

NSFetchRequest *allUsers = [[NSFetchRequest alloc] init];
[allUsers setAffectedStores:[NSArray arrayWithObject:[[self.tableViewContext persistentStoreCoordinator] persistentStoreForURL:storeURL]]];

* Mettre fin à l'application du fait exception uncaught 'NSInvalidArgumentException', raison: '* - [NSArray initWithObjects: count]: tentative d'insérer objet nul à des objets [0]

Il semble donc que je veux ajouter un magasin qui est en fait nul, parce que (je suppose), le système ne peut pas trouver un magasin dans ce storeURL donné (qui est le même que celui où je créé un magasin dans la première piste).

Je suppose que le PersistentStore est pas là dans la deuxième manche, il est donc pas enregistré correctement dans la première manche où il a été créé.

Comment puis-je économiser un PersistentStore, après que je l'ai ajouté, à la persistentStoreCoordinator?

Mise à jour:

Je pense que j'ai identifié le principal problème. Le persistentStoreCoordinator a changé après la première manche. Alors, comment puis-je enregistrer toutes ces choses (managedObjectContext, persistentStoreCoordinator) avant de fermer l'application?

aide quelqu'un peut-il me?

Mise à jour 2

Voici comment je crée le magasin:

    NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentPath = [searchPaths objectAtIndex:0];
    NSString* storeFileName = [NSString stringWithFormat:@"%@",newItem.name];
    NSURL *storeURL = [NSURL fileURLWithPath:[documentPath stringByAppendingPathComponent:storeFileName]];                            
     NSError* saveToStoreError;
    if(![[self.addContext persistentStoreCoordinator] addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&saveToStoreError]){
     NSLog(@"Error: %@, %@", saveToStoreError, [saveToStoreError userInfo]);
     abort();
    }
    else
    {
      NSError *saveStoreError;
      if(![self.addContext save:&saveStoreError])
      {
           NSLog(@"Saving Data wasn't possible!");
      }
    }

Mise à jour 3 Ainsi, après beaucoup d'essais, voici mes résultats:

  • Création des magasins fonctionne très bien. Je peux créer plusieurs magasins et je peux y accéder et les remplir tant que je suis en un seul passage de mon application.

Donc, quelque chose est en train de changer avec un redémarrage de mon application. Je pense que l'erreur doit être associé à la managedObjectContext, le persistentStoreCoordinator ou SAVING des magasins.

Dois-je changer les paramètres de mon délégué application pour la mise en place du managedObjectContext ou persistentStoreCoordinator?

Merci!

Était-ce utile?

La solution 4

Il était tout simplement facile.

Je n'ai pas mis addPersistentStoreWithType après le redémarrage dans une vue où j'ai essayé de récupérer les données de ce magasin.

Désolé pour ce poste. Tout simplement facile ;-) bangingmyheadonthewall

Autres conseils

La façon dont vous voix me conduit vos problèmes de soupçonner une sorte de confusion.

que PersistentStore change après chaque redémarrage. Est-ce le cas habituel?

Oui il est! un NSPersistentStore est un objet objectif-C comme tout autre objet. En tant que tel, il ne persiste pas dans les lancements. Vous devez recréer chaque fois.

Ce qui est persistant au sujet d'un NSPersistentStore est le fichier qu'il pointe vers. Mais chaque fois que vous exécutez votre application, vous devez recréer un nouvel objet NSPersistentStore, faisant probablement pointer vers le même fichier (défini par l'argument url à initWithPersistentStoreCoordinator:configurationName:URL:options:).

Alors, comment vous définissez votre variable storeURL?

Pour enregistrer le contexte d'objet géré, utilisez « Enregistrer » de NSManagedObjectContext méthode après l'ajout d'un nouveau magasin persistant et avant de fermer l'application. Ensuite, pour vérifier si les magasins persistants ont été ajoutés correctement, utilisez NSPersistentStoreCoordinator « persistentStores » méthode pour déterminer les magasins valides disponibles.

Je me demande si la question n'est pas les appels de base de données tant que si / quand ils sont appelés?

Lorsque vous « fermez l'application et nouveau départ » ... est l'application terminée entre les deux, ou est-il en tache de fond? IIRC qui affectera subtilement ce qui est appelé dans votre délégué App. Selon la façon dont les choses sont organisées il y a des données de base WRT, peut-être quelque chose accidentellement appelé (ou raté).

Je serais intéressé à voir ce qui se passe si on trace par chaque méthode apparentée solitaire de base de données dans votre délégué App (ou peu importe où ils se trouvent), pour voir si vous pouvez attraper plus rouge à lui. (S'il y a un cas de test minimal affiché quelque part, s'il vous plaît part!)

Jetez un oeil à l'application basée sur la fenêtre dans les modèles Xcode.

Cela crée un ensemble de la pile de base-données pour vous -. Magasin persistant, coordinateur du magasin persistant et contexte de l'objet géré

En supposant que votre application ne nécessite plus précisément, vous ne devriez avoir un magasin persistant. Ceci est, en effet, le fichier que les données sont écrites. En regardant votre code, il semble que vous essayez de créer votre propre magasin chaque fois que vous enregistrez des données.

Vous devez copier les méthodes de la pile de données de base à partir du modèle que je propose ci-dessus. Vous n'êtes pas obligé de se référer à la mémoire persistante ou le coordonnateur de stockage permanent vous. Tout ce que vous avez besoin est le contexte de l'objet géré créé par le délégué de l'application.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top