Compensation CoreData et que l'intérieur
Je suis assez nouveau à CoreData et cette application qui l'utilise.
Et je suis actuellement en train de travailler sur une fonction qui efface la totalité de la base de données lorsque je me connecte à l'application.
J'ai 2 sqllite fichiers (pour une raison quelconque, ils pensaient que c'était bien pratique)
Comment puis-je effacer les deux fichiers de toutes les données et de les remettre dans un dataless état?
J'en ai essayé beaucoup de façons, suivant les guides, sur.
Comment effacer/réinitialiser tous les CoreData dans un-à-plusieurs relations
comment faire pour supprimer tous les objets de Base de Données
Ils semblent tous à l'échec pour moi.
Maintenant, je me demande ce que je fais de mal? Et peut-être quelqu'un peut m'expliquer comment réinitialiser mon 2 fichiers CoreData la bonne façon.
EDIT:
//should clear the whole coredata database. mainly used for logout mechanism
-(void)resetCoreData
{
for (NSPersistentStore *store in self.persistentStoreCoordinator.persistentStores)
{
// NSPersistentStore *store = self.persistentStoreCoordinator.persistentStores[0];
NSError *error;
NSURL *storeURL = store.URL;
DLog(@"storeURL: %@", storeURL);
NSPersistentStoreCoordinator *storeCoordinator = self.persistentStoreCoordinator;
[storeCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];
DLog(@"There are erreurs: %@", error);
// [self addDefaultData];
}
_persistentStoreCoordinator = nil;
_managedObjectContext = nil;
_managedObjectModel = nil;
}
Cela ne semble pas clair le CoreData pour moi.
EDIT2:
- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
- (NSManagedObjectModel *)managedObjectModel
{
if (__managedObjectModel != nil) {
return __managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyName" withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return __managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (__persistentStoreCoordinator != nil) {
return __persistentStoreCoordinator;
}
NSString *storePath = [[self applicationDocumentsDirectory]
stringByAppendingPathComponent:@"MyName.sqlite"];
NSFileManager *fileManager = [NSFileManager defaultManager];
//If the expected store doesn't exist, copy the default store.
if (![fileManager fileExistsAtPath:storePath]) {
NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"MyName" ofType:@"momd"];
if (defaultStorePath) {
[fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
}
}
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
//Check to see what version of the current model we're in. If it's >= 2.0,
//then and ONLY then check if migration has been performed...
NSSet *versionIdentifiers = [[self managedObjectModel] versionIdentifiers];
DLog(@"Which Current Version is our .xcdatamodeld file set to? %@", versionIdentifiers);
if ([versionIdentifiers containsObject:@"2.0"])
{
BOOL hasMigrated = YES;
if (hasMigrated==YES) {
storePath = nil;
storePath = [[self applicationDocumentsDirectory]
stringByAppendingPathComponent:@"MyName2.sqlite"];
}
}
NSURL *storeUrl = [NSURL fileURLWithPath:storePath];
NSError *error;
NSDictionary *pscOptions = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:NO], NSInferMappingModelAutomaticallyOption,
nil];
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeUrl
options:pscOptions
error:&error]) {
DLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return __persistentStoreCoordinator;
}
Edit 3:
Je suis toujours à la recherche d'un moyen de réinitialiser mon CoreData comme si j'ai supprimé la totalité de l'app et a commencé à nouveau. Les façons habituelles de faire ne fonctionne pas pour mon cas. Et il y a 2 sqllite fichiers. Il y a des indices d'une migration qui a eu lieu à un certain point dans l'application, mais je ne sais pas trop quand et comment. Les journaux d'erreur montrent rien d'utile.
Je ne suis pas à la recherche de la manière la plus efficace. Juste la façon.
M'aider et que la générosité est la vôtre.
Edit 4:
RÉSULTAT FINAL:
Il semblait que mon héritage, code a eu un deuxième ManagedObjectContext instancié. Le moment où j'ai récupéré et fait la chasse d'eau-fonction avec elle. Les deux sqlite-fichiers ont disparu comme il était nécessaire.
Merci à tous de ce que mettre de l'effort dans mon problème.
Ne fonctionne pas de toute façon. Ce que je remarque, c'est que seul l'un des 2 magasins est enregistré. Ce pourrait être une raison pour le second de ne pas être à l'intérieur de la boucle for?
Lorsque vous configurez la base de données des trucs qu'il ne devrait avoir qu'une seule banque de toute façon. Qu'un magasin contiendra toutes vos données (sauf si vous faites quelque chose qui exige en particulier plus d'une)?
C'est tout l'héritage du code. Et c'est tout un gâchis. Et j'ai juste commencé à creuser dans cette application. Pour une raison quelconque il y a 2 CoreData SQLLite fichiers et il y a un indice d'une migration de la fonction. Mais je ne vois pas un besoin pour les 2 magasins.
Ah, je vois. Avez-vous le code qui définit et initialise le coredata pile? Je peux peut-être essayer de déchiffrer ce qui se passe.
OriginalL'auteur Totumus Maximus | 2013-02-06
Vous devez vous connecter pour publier un commentaire.
essayez la méthode suivante pour vider la base de données, il fonctionne parfaitement pour moi.
faire une chose, appliquer un point de rupture à la flushdatabase méthode, et accédez à votre "/Library/Application\ Support/iPhone\ Simulator" et ouvrez la base de données à l'aide de SQLITEMANAGER ou LITA et voir les entrées de base de données, et lorsque la chasse d'eau de la base de données exécution de la méthode d'actualisation de la base de données, vous verrez que votre base de données est complètement rincé. veuillez me mettre à jour lorsque vous effectuez cette opération de débogage.
Je suis en train de faire cette débogage maintenant. J'ai 2 fichiers sqlite. On est presque vide "db2.sqlite". L'autre a les données qui semble bien familier pour moi à partir de l'app "db.sqlite". Aucun d'eux obtient ses données supprimées après la méthode flush.
Je doute que vous n'avez pas le droit managedobjectcontext avec vous, quand u appellent le flushdatabase méthode.
cheers !!! débogage des règles 🙂
OriginalL'auteur yunas
De sorte que vous êtes en train de retirer le système de persistance de la persistance de coordonnateur du magasin, et puis essayer de supprimer le fichier. Mais juste de retirer de la banque de la coordinatrice n'est pas suffisant pour garantir que le fichier associé avec le magasin a été fermé, et si elle n'a pas le système de fichiers sera probablement vous empêcher de supprimer le fichier. Je ne peux pas dire à partir de votre question si vous êtes en utilisant un ARC ici, mais puisque vous dites que c'est un vieux code, il ya une bonne chance que vous ne l'êtes pas. De toute façon, si la suppression de la boutique entraîne autoreleased au lieu de sorti, ou si vous gardez tout autres références à la boutique, le magasin ne sera pas libéré simplement parce que vous l'avez supprimé de la coordonnatrice, le fichier peut rester ouverte, et de supprimer le fichier échoue.
Une bonne façon de voir ce qui se passe vraiment, en plus de regarder l'objet d'erreur fournis par
-removeItemAtPath:error:
, est de prendre un coup d'oeil dans le système de fichiers et voir si le fichier est toujours là après vous essayez de l'enlever. Aller à l'Organisateur de la fenêtre, sélectionnez votre appareil et de l'application, et de télécharger une copie de l'application sandbox. Vous devriez alors être en mesure de voir si le fichier est supprimé.Si vous ne voyez que les fichiers sont supprimés que vous pensez qu'ils devraient être, alors chercher d'autres moyens que les données peuvent être restaurées. Si l'Utilisateur se déconnecte, puis l'utilisateur b se connecte à l'application alors qu'il est encore en cours d'exécution, vous êtes sûr que vous avez commencé avec une nouvelle géré contexte de l'objet? Est-il possible que l'Utilisateur de données reste dans la MOC? Il pourrait alors être écrite lorsque vous créez et ajoutez un nouveau magasin. Une autre possibilité qui me vient à l'esprit est que iCloud est d ' "aider" ici. Je vois que vos fichiers de données sont conservés dans le répertoire Documents, et iOS sera normalement essayer de garder les fichiers dans ce répertoire sauvegardé sur iCloud. Peut-être lorsque vous créez un nouveau magasin pour UserB des données de l'iCloud ajoute UserA de documents à ce magasin. (Il semble peu probable -- je suis sûr que iCloud est plus sophistiquée que celle-mais quelque chose à vérifier.)
OriginalL'auteur Caleb
J'utilise cette fonction dans l'AppDelegate de l'une de mes applications...
Il supprime le système de persistance que CoreData usages et des feuilles de sorte qu'un nouveau est mis en place lorsque la base de données est accessible à nouveau.
C'est la méthode décrite dans le deuxième lien que vous avez fourni.
Ce n'est pas de travail? Quelles erreurs avez-vous? Comment savez-vous qu'il n'est pas de travail.
Je n'obtiens pas d'erreur que ce soit. Mais je remarque que quand je ne déconnectez puis reconnectez-vous sous un autre compte que toutes les données stockées dans le CoreData de l'ancien compte est toujours là et visible.
Êtes-vous en ajoutant les données de nouveau au démarrage de l'application?
Sans voir le code, je ne peux pas aider plus loin. Le code que j'ai posté fonctionne aussi je l'utilise pour faire exactement cela. Si quelque chose d'autre dans votre code n'est pas bien mis en place, alors il peut causer un problème.
OriginalL'auteur Fogmeister
Si votre application peut créer les fichiers puis il suffit de les supprimer lorsque l'application se ferme.
Si vous avez quelques notion de base de données qui a de précieuses informations de schéma, et vous avez juste besoin de tronquer le fichier, qui n'est pas vraiment le cas dans la base de données... Le schéma est dans la compilation des modèles d'entité et xcwhatever fichiers.
Aussi que je viens de lire qu'il est mauvais, parce que si vous voulez de base de données non persistantes alors que vous utilisez le mauvais outil.
NSInMemoryStoreType
. C'est pourquoi il est là, à droite?L'Ofc je veux que mes données persistantes. Voulez juste pour effacer tout cela lorsque vous vous connectez à votre compte. Ce qui est un cas rare mais pas celui que je devrais ignorer. Un utilisateur est automatiquement connecté après il s'est inscrit ou connecté à un certain point. Et ne pouvez vous connecter manuellement. Qui est une conscience loi de l'utilisateur pour effacer les données de cet utilisateur particulier. J'ai donc besoin d'être préparé pour un nouveau (ou le même) de l'utilisateur lorsqu'il se connecte.
puis téléchargez les .les fichiers de données et de les supprimer, sur le journal en de les télécharger de nouveau...
Je suppose que vous pourriez l'utiliser sans persistant persistant magasin... pour l'annulation de gestion peut-être... Mais c'est certainement une moins convaincante cas d'utilisation.
Il n'y a plus de gestionnaire d'annulation: l'inverse des relations, KVO, la gestion des versions, ... (dans le futur, peut-être que travailler la synchronisation iCloud). J'ai habituellement de quelques entités persistantes et le reste est dans la mémoire vive. Juste quelques clics pour les conserver (si j'ai décider de le faire) sans besoin de modifier quoi que ce soit.
OriginalL'auteur Grady Player