代码之家  ›  专栏  ›  技术社区  ›  Georg

Coredata迁移崩溃

  •  1
  • Georg  · 技术社区  · 7 年前

    在我最新的应用程序更新中,有几个用户抱怨崩溃,我设法拿到了一份崩溃报告。以下是符号化崩溃日志中的崩溃原因。

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

    [NSPersistentStoreCoordinator addPersistentStoreWithType:configuration:URL:options:error:]

    以下是完整的堆栈跟踪:

    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
    

    我没有更多关于这次坠机的细节。只有少数用户会这样,而不是所有用户。我不知道如何复制它以进行适当的修复。该用户报告说,该应用程序启动后“冻结”了一段时间,然后崩溃。它一直在这样做。

    编辑: 我对模型所做的更改只是在现有实体上添加了一些新属性。但是,如果自动迁移失败,对每个人来说都会失败,对吗?不仅仅是为了几个用户?!?

    所以我希望在座的人可能已经有了同样的问题和解决方法。或者至少是一种在应用程序不崩溃的情况下检测问题的方法。然后我可以为这些用户重新创建数据库。。。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Jon Rose    7 年前

    -(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;
    }
    

    看见 https://vimeo.com/89370886 大约55分钟 https://hamishrickerby.com/2012/06/04/core-data-migrations-and-large-data-sets/