2011-07-06 9 views
5

Tengo un problema extraño en mi aplicación Core Data.Problema de almacenamiento de datos centrales: no se puede actualizar el atributo transformable (NSArray)

Tengo tres entidades en mi aplicación, pero hoy he encontrado un problema con una de ellas. Mi entidad problemática se llama Invoice y tiene muchos atributos, incluido Products. Está codificado NSArray de NSDictionaries (a través de NSValueTransformer predeterminado).

Todo funciona bien, creo mi factura, su cliente, sus productos, etc. Todo funciona.

Pero, cuando elijo mi factura de una lista y luego trato de editar sus productos y hago clic en el botón "Guardar", mi guardado solo funciona hasta que se termina mi aplicación.

El problema es solo con mi matriz products; el resto (por ejemplo, fecha de pago, cliente, etc.) se guarda.


¿Qué estoy haciendo

yo paso mi objetivo Invoice través

NSManagedObject *inv = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
invoiceEditor.invoice = inv; 

Y guardar mis datos (en mi InvoiceEditor VC):

[self.invoice setValue:client forKey:@"Client"] // NSDictionary; 
[self.invoice setValue:products forKey:@"Products"] // NSArray of NSDictionaries; 
[self.invoice setValue:pmDate forKey:@"PaymentDate"] // NSDate; 
// other attributes 
NSManagedObjectContext *context = self.invoice.managedObjectContext; 
NSError *error = nil; 
if (![context save:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

Everythings ahorra hasta que se termine: cliente, pr oductos, fechas. Pero solo los productos son 'reseteados' después de la terminación.

¿Alguien?

+0

Aclaración: ¿Qué quiere decir con "productos reestablecidos"? ¿Quiere decir que el atributo del producto no se guarda? ¿Quiere decir que revierte a un valor anterior? En otras palabras, ¿qué *** esperar ver *** para el atributo 'productos' después de reiniciar y qué *** ver realmente ***? – TechZen

+0

¿Alguna razón en particular por la que no está utilizando una entidad y una relación en lugar de un conjunto de objetos NSDictionary dentro de un NSArray? Esa es una configuración muy engorrosa y (lo más probable) lenta. – TechZen

+0

1. Quiero decir que el atributo de productos se guarda pero después de que mi aplicación se termina, vuelve al valor anterior. 2. No utilizo la relación porque necesito los productos todo el tiempo, incluso si el usuario los ha eliminado.Tengo una entidad llamada 'Producto', pero en mi 'Factura' estoy almacenando su copia. – akashivskyy

Respuesta

4

Acabo de encontrar el problema. De Model Object Implementation Guide:

Si hay versiones mutables e inmutables de una clase que utiliza para representar una propiedad, tales como NSArray y NSMutableArray-que debería declarar lo general el valor de retorno del acceso Get como un objeto inmutable, aunque internamente el modelo usa un objeto mutable

Y mi arsenal products era en realidad una instancia NSMutableArray. Lo resolví copiando products (así que convertí la matriz mutable a matriz inmutable). Ahora funciona. :) Y no necesité comenzar la recompensa ...

+0

Estoy destrozando mi cerebro en cuanto a qué loco tipo de detalle de implementación llevaría al efecto que estás viendo. ¿Por qué debería el comportamiento ser diferente para una matriz mutable, que es polimórfica a una matriz inmutable, y por lo tanto, requiere una acción particular para ser distinguida en el tiempo de ejecución? Y aún más intrigante: ¿por qué es la fugacidad el resultado? – hatfinch

+0

No sé por qué es eso. Y no me importa, ¡mi aplicación solo funciona! : P – akashivskyy

+1

Creo que hay dos tipos de programadores en este mundo: aquellos que solo quieren que su código funcione y aquellos que quieren entender por qué lo hace. – hatfinch

0

De hecho, acabas de encontrar el problema. Lo siento, acabo de leer su problema, pero CoreData tiene varios problemas durante el guardado.

Cada atributo en una entidad CoreData debe ser un objeto inmutable.

Cuestiones relacionadas