J'ai des problèmes avec ma coredata sqlite DB, qui héberge un livre DB. Après un crash, un utilisateur rencontre le problème, que les données ne sont plus correctement affichées dans sa tableview.coredata sqlite malformé DB
Cela est dû au fait que la méthode performFetch renvoie une erreur:
[NSFetchedResultsController deleteCacheWithName:nil];
if (![[self fetchedResultsController] performFetch:&error]) {
//NSArray *array = [[self fetchedResultsController] fetchedObjects];
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
#ifdef DEBUG
abort();
#endif
}
qui se traduit par ce message d'erreur:
Erreur non résolue erreur Domaine = NSCocoaErrorDomain Code = 134060 « Le couldn de fonctionnement Ne pas être terminé. (Cocoa error 134060.) "UserInfo = 0x1dff80 {reason = L'objet récupéré à l'index 312 a un nom de section en désordre 'Z. Les objets doivent être triés par nom de section '}, { reason = "L'objet récupéré à l'index 312 a un nom de section en désordre' Z. Les objets doivent être triés par nom de section '";
Lorsque j'examine le fichier sqlite avec 'SQLite Database Browser 2.0 b1', les attributs de chaque entité semblent convenir.
Lorsque je supprime certaines des entités mentionnées tout fonctionne à nouveau correctement.
Je voudrais savoir comment je peux savoir exactement ce qui ne va pas avec les entités mentionnées et corriger cela, afin que l'utilisateur puisse à nouveau utiliser ses données. Bien sûr, je veux corriger le bug qui provoque la base de données mal formée, mais ce n'est pas le cas dans ce post.
Quelqu'un a-t-il des indices sur ce que je pourrais voir ou ce qui pourrait être malformé dans ma base de données ou sur le "nom d'une section hors service"?
C'est le code pour mon fetchedResultsController:
- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController != nil) {
return fetchedResultsController;
}
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity;
entity = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:[[GlobalData sharedInstance] managedObjectContext]];
[fetchRequest setEntity:entity];
// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:10];
//set searchPredicate
NSPredicate *predicate = nil;
if (self.bibList != nil) {
predicate = [NSPredicate predicateWithFormat:@"ANY BibLists.name LIKE %@", self.bibList.name];
}
if (predicate) {
[fetchRequest setPredicate:predicate];
}
// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor;
NSString *sortDescriptorString = nil;
sortDescriptorString = @"title";
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortDescriptorString ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSString *sectionNameKeyPath = nil;
sectionNameKeyPath = @"uppercaseFirstLetterOfTitle";
// Edit the section name key path and cache name if appropriate.
// nil for section name key path means "no sections".
NSFetchedResultsController *aFetchedResultsController;
aFetchedResultsController = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest
managedObjectContext:[[GlobalData sharedInstance] managedObjectContext]
sectionNameKeyPath:sectionNameKeyPath
cacheName:@"Bibliography"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
[aFetchedResultsController release];
[fetchRequest release];
[sortDescriptor release];
[sortDescriptors release];
return fetchedResultsController;
}
Merci b00tsy
Incluez votre code de requête d'extraction et tous les descripteurs de tri ajoutés. – falconcreek
Est-ce que 'uppercaseFirstLetterOfTitle' est une propriété transitoire ou persistante? Existe-t-il une entrée commençant par une lettre minuscule dans 'title'? – falconcreek
'uppercaseFirstLetterOfTitle' est un attribut transitoire. il y a des entités qui ont des lettres minuscules et des lettres non-ascii dans 'title' – b00tsy