После добавления атрибута String с именем localFilePath к объекту Core Data с именем GenericAttachment мы начали получать исключение при попытке отобразить набор этих объектов.
Некоторые из наших сущностей имеют отношение ко многим, называемое «привязанностями», к неупорядоченной коллекции GenericAttachment.
Один из этих объектов называется InspectionMO. GenericAttatchment имеет отношение «ко-многим» «осмотр» (не «осмотр», упс) к InspectionMO. Когда мы получаем вложения InspectionMO и пытаемся отобразить их, мы получаем следующее исключение:
NSInternalInconsistencyException
I/O error for database at /Users/justingarcia/Library/Developer/CoreSimulator/Devices/D075B44C-4F54-4703-8817-3DC4A6E7314E/data/Containers/Data/Application/F425E5AC-C215-4BE8-93DB-A3E6C48C83C4/Library/Application Support/Procore/Procore. SQLite error code:1, 'no such column: t1.Z_55ATTACHMENTS5'
Вот трассировка стека исключений:
#0 0x000000010c94f705 in objc_exception_throw ()
#1 0x000000010e928f00 in -[NSSQLiteConnection prepareSQLStatement:] ()
#2 0x000000010ea99305 in -[NSSQLiteConnection selectRowsWithStatement:cached:] ()
#3 0x000000010e941d0b in newFetchedRowsForFetchPlan_MT ()
#4 0x000000010eb6e574 in _newFetchedPKsForRelationshipFaultRequest ()
#5 0x000000010eb6efba in _executeNewValuesForRelationshipFaultRequest ()
#6 0x000000010ead19a2 in -[NSSQLRelationshipFaultRequestContext executeRequestCore:] ()
#7 0x000000010eb40a00 in -[NSSQLStoreRequestContext executeRequestUsingConnection:] ()
#8 0x000000010eb14e5b in __52-[NSSQLDefaultConnectionManager handleStoreRequest:]_block_invoke ()
#9 0x000000011b25f602 in _dispatch_client_callout ()
#10 0x000000011b26d653 in _dispatch_lane_barrier_sync_invoke_and_complete ()
#11 0x000000010eb14d40 in -[NSSQLDefaultConnectionManager handleStoreRequest:] ()
#12 0x000000010eb1cbb4 in -[NSSQLCoreDispatchManager routeStoreRequest:] ()
#13 0x000000010ea61515 in -[NSSQLCore dispatchRequest:withRetries:] ()
#14 0x000000010ea5cdaa in -[NSSQLCore _newValuesForRelationship:forObjectWithID:withContext:error:] ()
#15 0x000000010e97a8cb in -[NSSQLCore newValueForRelationship:forObjectWithID:withContext:error:] ()
#16 0x000000010ea449d9 in __110-[NSPersistentStoreCoordinator(_NSInternalMethods) newValueForRelationship:forObjectWithID:withContext:error:]_block_invoke ()
#17 0x000000010ea39437 in -[NSPersistentStoreCoordinator _routeLightweightBlock:toStore:] ()
#18 0x000000010e97a7f7 in -[NSPersistentStoreCoordinator(_NSInternalMethods) newValueForRelationship:forObjectWithID:withContext:error:] ()
#19 0x000000010ea0b89e in __107-[NSManagedObjectContext(_NestedContextSupport) newValueForRelationship:forObjectWithID:withContext:error:]_block_invoke ()
#20 0x000000010e972108 in internalBlockToNSManagedObjectContextPerform ()
#21 0x000000011b25f602 in _dispatch_client_callout ()
#22 0x000000011b26d653 in _dispatch_lane_barrier_sync_invoke_and_complete ()
#23 0x000000010e972074 in _perform ()
#24 0x000000010e972c37 in -[NSManagedObjectContext(_NestedContextSupport) newValueForRelationship:forObjectWithID:withContext:error:] ()
#25 0x000000010e97a421 in -[NSFaultHandler retainedFulfillAggregateFaultForObject:andRelationship:withContext:] ()
#26 0x000000010e9a621e in -[_NSFaultingMutableSet willReadWithContents:] ()
#27 0x000000010e94e6a6 in -[_NSFaultingMutableSet count] ()
#28 0x000000011a9e9bdd in protocol witness for Collection.count.getter in conformance Set<A> ()
#29 0x000000011a8726d1 in Collection.map<A>(_:) ()
#30 0x00000001162ad07e in ObjectImportHelper.copyToMany<A>(_:to:cache:deleteMissing:onCopy:) at /Users/justingarcia/2/iOS/Procore/Core/Utils/ObjectImportHelper+Relationships.swift:163
…
А вот некоторые из основных данных регистрации:
CoreData: sql: SELECT 0, t0.Z_PK FROM Z_55INSPECTION t1 JOIN ZGENERICATTACHMENT t0 ON t0.Z_PK = t1.Z_55ATTACHMENTS5 WHERE t1.Z_70INSPECTION = ?
2019-01-25 13:50:17.727987-0800 Procore[34877:10124838] [logging] no such column: t1.Z_55ATTACHMENTS5
CoreData: annotation: Disconnecting from sqlite database due to an error.
2019-01-25 13:50:17.748021-0800 Procore[34877:10124838] [error] error: (1) I/O error for database at /var/mobile/Containers/Data/Application/FFEB392B-302B-479E-98E8-008333FC2714/Library/Application Support/Procore/Procore. SQLite error code:1, 'no such column: t1.Z_55ATTACHMENTS5'
CoreData: error: (1) I/O error for database at /var/mobile/Containers/Data/Application/FFEB392B-302B-479E-98E8-008333FC2714/Library/Application Support/Procore/Procore. SQLite error code:1, 'no such column: t1.Z_55ATTACHMENTS5'
CoreData: annotation: total fetch execution time: 0.0207s for 0 rows.
2019-01-25 13:50:17.748727-0800 Procore[34877:10124838] [error] error: exception during newFetchedPKsForSourceID: I/O error for database at /var/mobile/Containers/Data/Application/FFEB392B-302B-479E-98E8-008333FC2714/Library/Application Support/Procore/Procore. SQLite error code:1, 'no such column: t1.Z_55ATTACHMENTS5' with userInfo of {
NSFilePath = "/var/mobile/Containers/Data/Application/FFEB392B-302B-479E-98E8-008333FC2714/Library/Application Support/Procore/Procore";
NSSQLiteErrorDomain = 1;
}
Мы используем NSPersistentStoreDescription's shouldMigrateStoreAutomatics и shouldInferMappingModelAutomatics, и я не вижу никаких ошибок миграции в журналах (мы используем -com.apple.CoreData.MigrationDebug 1).
Мы открыли файл базы данных SQLite и обнаружили, что таблица Z_55INSPECTION имеет столбец с именем Z_55ATTACHMENTS6 (не Z_55ATTACHMENTS5) как до, так и после перехода на эту новую версию, где мы добавили атрибут localFilePath в GenericAttachment.
Так почему Core Data ищет столбец с именем Z_55ATTACHMENTS5 вместо Z_55ATTACHMENTS6?
Мы нашли эти две статьи списка рассылки Apple после поиска в Google: вопрос и это продолжение , которое, как мне кажется, говорит о появлении числа в конце имени столбца когда несколько объектов имеют-много отношений одного и того же имени с другим объектом. В нашем случае у нас есть несколько отношений «многие ко многим», называемых приложениями к GenericAttachment. Но мы не добавили новое отношение, называемое вложениями, мы просто добавили атрибут в GenericAttachment. Может быть, если мы переименуем все эти отношения в уникальные, проблема исчезнет?