Core Data le permite agregar múltiples almacenes persistentes a un solo nombre NSPersistentStoreCoordinator
(cada uno con una configuración diferente), reuniéndolos en un solo NSManagedObjectContext
. Lo que no he podido averiguar es cómo Core Data maneja la atomicidad de una operación de guardado para múltiples tiendas.atomicidad del almacén de datos centrales con múltiples almacenes
Digamos que tengo dos tiendas:
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] init];
[coordinator addPersistentStoreWithType:type configuration:@"A" URL:aURL options:nil error:NULL];
[coordinator addPersistentStoreWithType:type configuration:@"B" URL:bURL options:nil error:NULL];
NSManagedObjectContext *context = [[NSManageObjectContext alloc] init];
[context setPersistentStoreCoordinator:coordinator];
Y entonces es el momento para salvar a hacer eso:
NSError *error = nil;
BOOL result = [context save:&error];
La documentación indica que la secuencia de los eventos será:
- Guardar tienda A
- Guardar tienda B
¿Qué sucede si la tienda A guarda correctamente, pero la tienda B no se puede guardar por algún motivo? (por ejemplo, se eliminó el archivo en el disco o los permisos lo hicieron de solo lectura, ese tipo de cosas). No puedo encontrar ninguna documentación que detalle si Core Data revertirá los cambios en la tienda A.
Me parece extraño que el gráfico objeto se deje en un estado inconsistente (es decir, una tienda actualizada, otra no), pero un tanto complicado y con muchos recursos para realizar un ahorro totalmente atómico en múltiples tiendas. Realmente me gustaría alguna aclaración aquí, ¡tal vez de alguien con más experiencia en el sistema!
No he intentado esto todavía. Soy un poco cauteloso de considerar el resultado experimental como el comportamiento documentado, ya que cualquier cambio en el comportamiento sería bastante catastrófico para lo que estoy planeando. Tenía la esperanza de que alguien pudiera señalarme un trozo de documentación sobre el tema que no había podido encontrar en mis búsquedas. –
Bueno, no puedo encontrar ninguna documentación. Luego planificaría para el peor de los casos y asumir que la reversión no funcionará en dos almacenes de datos y me aseguraré de que el código pueda manejar esto de alguna manera. Siempre puedes intentar hacer inserciones en tablas ficticias antes de comenzar tu gran transacción para asegurarte de que el estado de las tiendas sea correcto. – Grouchal
@Grouchal - No estoy seguro de que la prueba que está proponiendo funcionaría. De manera predeterminada, CoreData creará la segunda tienda según sea necesario (si el archivo se cerró como usted sugiere). Si el archivo estuviera abierto, el sistema de archivos Unix desvincularía el archivo del sistema de archivos, pero la pila CoreData aún tendría acceso al archivo no enlazado hasta que se cerrara. – xyzzycoder