Esto es bastante divertido. En mi aplicación, creo miles de entradas en la base de datos (en otro hilo, estoy usando MagicalRecord). Todo parece funcionar bien (desde un punto de vista de fondo/primer plano/contexto).NSPredicate no ejecutado
Cuando, en el hilo principal, trato de recuperar los datos "acaba de insertar", descubrí el siguiente comportamiento:
- (NSArray *) familiesInCompany:(Company *) company {
NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"company == %@", company];
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"company.name == %@", company.name];
NSArray *first = [Family MR_findAllSortedBy:@"name" ascending:YES withPredicate:predicate1];
NSArray *second = [Family MR_findAllSortedBy:@"name" ascending:YES withPredicate:predicate2];
NSArray *third = [Family MR_findByAttribute:@"company" withValue:company andOrderBy:@"name" ascending:YES];
return second;
}
Ahora lo que consigo es:
- primera: es una matriz vacía
- segundos: contiene todos los
Family
objetos, como se esperaba - tercera: es una matriz vacía.
Por la depuración de la instrucción SQL consigo el siguiente:
La "primera" declaración:
CoreData: anotación: tiempo total de ejecución tomará: 0.0000s de 0 filas.
La "segunda" declaración ":
CoreData: SQL: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZNAME, t0.ZCOMPANY DE ZFAMILY t0 t1 JOIN ZCOMPANY EN T0. ZCOMPANY = t1.Z_PK DONDE t1.ZNAME = ORDER BY t0.ZNAME
CoreData:? anotación: conexión de SQL buscar a tiempo: 0.0005s
CoreData: anotación: tiempo total de ejecución ir a buscar: 0.0007s de 2 filas.
El "tercer" declaración:
CoreData: anotación: ir a buscar total de tiempo de ejecución: 0.0000s de 0 filas.
Lo gracioso es que cierro la aplicación (me refiero a realmente termino manualmente) y y abro de nuevo, todos los tres estados "ir a buscar" funcionan.
¿Por qué la primera y la tercera instrucción de búsqueda parecen no ejecutarse nunca? ¿Cómo profundizar en el problema?
Teniendo esencialmente el mismo problema, creo, con una implementación de NSFetchedResultsController. Los registros creados recientemente no se muestran en el resultado de búsqueda, sino que se escriben en el almacén persistente cuando lo compruebo directamente: el recuento correcto incluso aparece en la relación NSSet, pero el NSPredicate no los ve. Extraño. Uso de MagicalRecord 2: utilicé una versión 1.x para un proyecto anterior y no tuve problemas, así que simplemente puedo cambiar el curso y usar una versión anterior. –
Pregunta ingenua (y algo fuera de tema): ¿cómo estás registrando las sentencias sql? Tengo mucha curiosidad sobre cómo hacer eso en mi aplicación para comprender mejor los predicados –
@FelipeSabino ver http://stackoverflow.com/questions/6428630/xcode4-and-core-data-how-to-enable-sql-debugging y http://d.pr/i/Lszs –