2011-12-03 10 views
7

Estoy usando UIManagedDocument para administrar mis datos. Creo el modelo y lo uso, y todo parece estar funcionando, pero mis cambios no se escriben nuevamente en la tienda de SQLite.UIManagedDocument no guarda

La documentación de UIManagedDocument dice que el autoguardado debe encargarse de conservar los datos en la base de datos, pero eso no parece estar sucediendo.

NSManagedObjectContext *moc = [doc managedObjectContext]; 
    NSError *error = nil; 
    MyItem *itemToAdd = (MyItems *)[moc existingObjectWithID:(NSManagedObjectID *)itemsID error:&error]; 

Esto recupera el objeto que quiero agregar (y tiene éxito).

[itemContainer addItemsObject:itemToAdd]; 
    [doc updateChangeCount:UIDocumentChangeDone]; 

Esto agrega el elemento a una colección de artículos en otro objeto, y luego le dice al documento que he terminado de hacer cambios.

Esperaré un poco de tiempo después de esto para ver el cambio escrito en la tienda Core Data, pero mirando en Instruments, veo que nunca sucede.

La colección de artículos es una NSOrderedSet, y debido a los comentarios sobre este artículo:

Exception thrown in NSOrderedSet generated accessors

He añadido un addItemsObject: el objeto que contiene la colección:

- (void)addItemsObject:(MyItem *)value 
{ 
    NSMutableOrderedSet* tempSet = [NSMutableOrderedSet orderedSetWithOrderedSet:self.items]; 
    [tempSet addObject:value]; 
    self.items = tempSet; 
} 

Tal vez algo anda mal con Core Data informando que la colección de elementos ha cambiado, pero no veo cómo.

+0

Con Instruments, puedo ver que los datos se escriben en el Core Data Cache. Pero no aparece en el instrumento Core Data Saves, y si lo mato y reinicio la aplicación, mis cambios desaparecerán. – stevex

+3

Encontré mi problema. Resulta que tuve un error con el objeto que estaba tratando de agregar (perdí una propiedad requerida) y sin anular handleError no hay indicación de que haya un problema. Blogueó sobre esto aquí: http://blog.stevex.net/2011/12/uimanageddocument-autosave-troubleshooting/ – stevex

Respuesta

9

Encontré mi problema. Resulta que tuve un error con el objeto que estaba tratando de agregar (perdí una propiedad requerida) y sin anular handleError no hay indicación de que haya un problema.

escribió en su blog sobre él aquí: http://blog.stevex.net/2011/12/uimanageddocument-autosave-troubleshooting/

+1

este es un hallazgo excelente: el hecho de que CoreData en muchos casos permitirá que los objetos se conserven en la memoria, pero no guardar en el disco puede ser * extremadamente * engañoso a veces, y la corrección que ha dado es excelente. – NSTJ

+0

Pongo una respuesta que resume su enlace en caso de fallo futuro del enlace :) – olynoise

1

En mi método en el que obtener los datos desde el servidor, que creen en primer lugar las Entidades y después de eso me llaman a estos dos métodos para guardar los cambios en el documento de inmediato:

[self.document updateChangeCount:UIDocumentChangeDone]; 
[self.document savePresentedItemChangesWithCompletionHandler:^(NSError *errorOrNil) { 
      ... 
     }]; 
0

comida para llevar clave/resumen del enlace de @ stevex:

Asegúrese de llamar al método de la UIManagedDocument -updateChangeCount o desencadenar un cambio que se ha registrado en el documento de undoManager. De lo contrario, el documento no cree que necesite guardar nada.

Además, la creación de subclase de algunos métodos clave le permitirá ver cuándo se produce el autoguardado y si hay errores.

- (id)contentsForType:(NSString *)typeName error:(NSError * _Nullable __autoreleasing *)outError { 

    id retVal = [super contentsForType:typeName error:outError]; 
    NSLog(@"Autosaving document. contentsForType at fileURL %@ error %@", self.fileURL, *outError); 
    return retVal; 
} 


- (void)handleError:(NSError *)error userInteractionPermitted:(BOOL)userInteractionPermitted { 
    [super handleError:error userInteractionPermitted:userInteractionPermitted]; 
    NSLog(@"ManagedDocument handleError: %@ %@", error.localizedDescription, error.userInfo); 
} 
Cuestiones relacionadas