Pregunta

Estoy usando UIManagedDocument para administrar mis datos. Creo el modelo y lo uso, y todo parece estar funcionando, pero mis cambios no se están escribiendo en la tienda SQLite.

La documentación para UIManagedDocument dice que el autosave debe encargarse de persistir 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 obtiene el objeto que quiero agregar (y tiene éxito).

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

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

Esperaría que algún tiempo poco después de esto vea el cambio escrito en el almacén de datos principal, pero observando en instrumentos, veo que nunca sucede.

La colección de elementos es un NSOrderedset, y debido a los comentarios sobre este elemento:

Excepción lanzada en accesorios generados por NSOrderedSet

He agregado un AddItemSObject: al objeto que contiene la colección:

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

Quizás algo salga mal con los datos básicos informados de que la colección de elementos ha cambiado, pero no veo cómo.

¿Fue útil?

Solución

Encontré mi problema. Resulta que tuve un error con el objeto que intentaba agregar, me perdí una propiedad requerida, y sin anular el manejar, no hay indicios de que haya un problema.

Blogueó al respecto aquí:http://blog.stevex.net/2011/12/uimanageddocument-autosave-troubleshooting/

Otros consejos

En mi método donde obtengo datos del servidor, primero creo las entidades y después de eso llamo a estos dos métodos para guardar los cambios en el documento de inmediato:

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

Llave lleva / resumen del enlace de @Stevex:

Asegúrese de llamar al UIMANEDDOCUMENTO -updateChangeCount método o activar un cambio registrado con el documento undoManager. De lo contrario, el documento no cree que necesite guardar nada.

Además, la subclasificación de algunos métodos clave le permitirá ver cuándo se produce el servicio de espera 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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top