2017-08-22 3 views
0

Lors de ma dernière mise à jour de l'application, quelques utilisateurs se sont plaints des plantages et j'ai réussi à obtenir un rapport d'erreur. Voici la raison de l'accident du journal de crash symbolisé.Coredata Migration Crash

Exception Type: EXC_CRASH (SIGKILL) 
Exception Codes: 0x0000000000000000, 0x0000000000000000 
Exception Note: EXC_CORPSE_NOTIFY 
Termination Reason: Namespace SPRINGBOARD, Code 0x8badf00d 
Triggered by Thread: 0 

Cela se produit lorsque j'appelle [NSPersistentStoreCoordinator addPersistentStoreWithType:configuration:URL:options:error:]

Voici le stacktrace complet:

Thread 0 name: Dispatch queue: SQLQueue 0x12fecca10 for .database.db.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3 
Thread 0 Crashed: 
0 libsystem_kernel.dylib   0x0000000180640164 __fcntl + 8 
1 libsystem_kernel.dylib   0x0000000180625660 fcntl + 84 
2 libsqlite3.dylib    0x0000000181ba3f90 0x181b3d000 + 421776 
3 libsqlite3.dylib    0x0000000181bb9e50 0x181b3d000 + 511568 
4 libsqlite3.dylib    0x0000000181bcdf34 0x181b3d000 + 593716 
5 libsqlite3.dylib    0x0000000181bcdd98 sqlite3_wal_checkpoint_v2 + 492 
6 libsqlite3.dylib    0x0000000181ba41b0 0x181b3d000 + 422320 
7 libsqlite3.dylib    0x0000000181b7b288 sqlite3_step + 976 
8 CoreData      0x000000018391b194 _execute + 164 
9 CoreData      0x000000018394ffd8 -[NSSQLiteConnection commitTransaction] + 312 
10 CoreData      0x0000000183a6ced8 __43-[_NSSQLiteStoreMigrator performMigration:]_block_invoke + 2784 
11 CoreData      0x0000000183a36cbc __37-[NSSQLiteConnection performAndWait:]_block_invoke + 40 
12 libdispatch.dylib    0x00000001804fe9a0 _dispatch_client_callout + 16 
13 libdispatch.dylib    0x000000018050bee0 _dispatch_barrier_sync_f_invoke + 84 
14 CoreData      0x0000000183a36c08 -[NSSQLiteConnection performAndWait:] + 144 
15 CoreData      0x0000000183a6c35c -[_NSSQLiteStoreMigrator performMigration:] + 184 
16 CoreData      0x0000000183a63db0 -[NSSQLiteInPlaceMigrationManager migrateStoreFromURL:type:options:withMappingModel:toDestinationURL:destinationType:destinationOptions:error:] + 1912 
17 CoreData      0x00000001839ee814 -[NSMigrationManager migrateStoreFromURL:type:options:withMappingModel:toDestinationURL:destinationType:destinationOptions:error:] + 556 
18 CoreData      0x0000000183a5f090 -[NSStoreMigrationPolicy(InternalMethods) migrateStoreAtURL:toURL:storeType:options:withManager:error:] + 324 
19 CoreData      0x0000000183a5e3ec -[NSStoreMigrationPolicy migrateStoreAtURL:withManager:metadata:options:error:] + 120 
20 CoreData      0x0000000183a5fb08 -[NSStoreMigrationPolicy(InternalMethods) _gatherDataAndPerformMigration:] + 2440 
21 CoreData      0x00000001839fc188 __91-[NSPersistentStoreCoordinator addPersistentStoreWithType:configuration:URL:options:error:]_block_invoke + 4160 
22 CoreData      0x0000000183a08630 gutsOfBlockToNSPersistentStoreCoordinatorPerform + 168 
23 libdispatch.dylib    0x00000001804fe9a0 _dispatch_client_callout + 16 
24 libdispatch.dylib    0x000000018050bee0 _dispatch_barrier_sync_f_invoke + 84 
25 CoreData      0x00000001839f7d70 _perform + 200 
26 CoreData      0x000000018390d5e4 -[NSPersistentStoreCoordinator addPersistentStoreWithType:configuration:URL:options:error:] + 388 

Je n'ai pas plus de détails sur l'accident. Seulement que cela arrive pour quelques utilisateurs et pas tous. Je n'ai aucune idée de comment le reproduire pour une solution correcte. L'utilisateur a signalé que l'application a démarré, a été "gelée" pendant un certain temps et s'est ensuite écrasée. Et cela continue de le faire.

J'ai regardé la dernière version du modèle de données de base depuis que j'ai expédié l'application et ce fichier est toujours le même. Au cours du développement, j'ai ajouté 5 autres versions, mais cela ne devrait pas être un problème non? La version livrée dans l'application avant la mise à jour est intacte ...

EDIT: Les modifications apportées au modèle consistaient simplement à ajouter de nouvelles propriétés aux entités existantes. Mais si l'auto-migration échouait, cela échouerait pour tout le monde, n'est-ce pas? Pas seulement pour quelques utilisateurs?!?

Alors j'espérais que quelqu'un ici pourrait déjà avoir le même problème et une solution sur la façon de le réparer. Ou au moins un moyen de détecter le problème sans que l'application plante. Ensuite, je pourrais simplement recréer la base de données pour ces utilisateurs ...

+0

C'est une trace de la pile intéressante. Les données de base démarrent la migration mais explosent à un moment donné. Je demanderais à l'utilisateur si son appareil manque d'espace. En outre, il peut être utile de modifier votre question pour décrire les modifications que vous avez apportées à votre modèle. –

+0

Hey Tom, je vais demander à l'utilisateur! Qu'est-ce qui vous fait penser qu'il pourrait s'agir d'un espace disque réduit? J'ai mis à jour ma question sur les changements ... Les changements que j'ai apportés au modèle consistaient simplement à ajouter de nouvelles propriétés sur des entités existantes. Mais si l'auto-migration échouait, cela échouerait pour tout le monde, n'est-ce pas? Pas seulement pour quelques utilisateurs?!? Avez-vous une idée de la façon dont je pourrais reproduire l'erreur? – Georg

+0

Comme cela fonctionne pour la plupart des utilisateurs, il semble que la migration soit correctement configurée. Votre trace de pile soutient that-- tout fonctionne, mais alors ** boom **. Cela laisse la question de ce qui est unique chez ces quelques utilisateurs. Le manque d'espace n'affecterait pas la plupart des utilisateurs et pourrait faire exploser les choses au milieu d'une migration qui marche autrement. –

Répondre

1

Les migrations de données de base peuvent prendre du temps. Si le chargement de votre première vue prend trop de temps, alors le chien de garde se lancera dans la destruction de votre application. Cela peut se produire lorsque l'utilisateur a beaucoup plus de données que prévu. Ajoutez plutôt un vérificateur de migration. Et si vous devez effectuer une migration, affichez une interface de chargement avec une animation de chargement pendant que vous chargez le magasin.

-(BOOL) storeNeedsMigrationAtURL:(NSString*) sourceStorePath{ 
    if (![[NSFileManager defaultManager] fileExistsAtPath:sourceStorePath]) { 
     // Database doesn't yet exist. No need to test data compatibility" 
     return NO; 
    } 
    NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:"<Your models directory name>" ]; 
    NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model]; 

    NSError *error = nil; 
    NSURL *sourceStoreURL = [NSURL fileURLWithPath:sourceStorePath]; 
    NSDictionary *sourceStoreMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:sourceStoreURL options:nil error:&error]; 

    // Do error checking... Removed from the code sample. 
    NSManagedObjectModel *destinationModel = [psc managedObjectModel]; 
    BOOL isCompatible = [destinationModel isConfiguration:nil 
           compatibleWithStoreMetadata:sourceStoreMetadata]; 

    return isCompatible; 
} 

voir https://vimeo.com/89370886 environ 55 minutes vous pouvez également lire https://hamishrickerby.com/2012/06/04/core-data-migrations-and-large-data-sets/

+0

Oui ... en effet ... en attendant j'ai fait quelque chose comme ça! mais le 'isConfiguration: compatibleWithStoreMetadata' ne l'a pas détecté correctement ... au lieu de cela je vérifie maintenant les hachages d'entité ... Et si je détecte une migration nécessaire, je présente alors à l'utilisateur un dialogue d'attente et la migration en Contexte... Et le problème pourquoi il n'a affecté que quelques utilisateurs c'est qu'il est rapide si la base de données n'est pas complète, mais une fois que les utilisateurs ont beaucoup de données, cela prend beaucoup plus de temps ... – Georg