ios - sobre - Datos principales: filtrado de una relación a muchos utilizando predicciones
tesis sobre youtube pdf (2)
Eche un vistazo a este documento de Apple. Hace un ejemplo haciendo lo que estás tratando de hacer con el predicado "CUALQUIERA".
Tengo las siguientes dos entidades en mi Modelo de datos básicos:
Manufacture {name, ...other attributes}
Product {name, .... other attributes}
Configuré una relación de uno a muchos:
Manufacturer.manufactures <------>> Product.manufacturedBy
Estoy intentando construir un predicado para devolver todos los productos que pertenecen a los fabricantes que coinciden con una cadena de búsqueda. Por ejemplo, si hay dos fabricantes, "King Nut" y "Queen Nut", una búsqueda en "Nut" debería devolver todos los productos elaborados por King Nut y Queen Nut.
Mi predicado funciona perfectamente cuando mi filtro está en la entidad Producto, sin embargo, no puedo obtener ningún predicado para que funcione cuando filtre en la entidad Fabricante. El conjunto de resultados está vacío.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Product" inManagedObjectContext:[GBKDB context]];
searchValue = @"nut";
NSString *wildcardString = [NSString stringWithFormat:@"*%@*", searchValue];
He probado lo siguiente:
predicate = [NSPredicate predicateWithFormat:@"manufacturedBy.name CONTAINS[cd] %@",searchValue];
predicate = [NSPredicate predicateWithFormat:@"manufacturedBy.name like %@",wildcardString];
predicate = [NSPredicate predicateWithFormat:@"manufacturedBy.name matches %@",wildcardString];
predicate = [NSPredicate predicateWithFormat:@"ALL manufacturedBy.name like %@",wildcardString];
predicate = [NSPredicate predicateWithFormat:@"ALL manufacturedBy.name like[cd] %@",@wildcardString];
Para obtener un Product
s fabricado por un fabricante con un nombre que contenga "tuerca", su solicitud debe verse así:
NSString* searchVal = @"nut";
NSFetchRequest* r = [[NSFetchRequest alloc] initWithEntityName:@"Product"];
[r setPredicate:[NSPredicate predicateWithFormat:@"manufacturedBy.name CONTAINS[cd] %@",searchVal]];
Para obtener Manufacturer
con nombres de productos que contengan "tuerca", su solicitud debe verse así:
NSString* searchVal = @"nut";
NSFetchRequest* r = [[NSFetchRequest alloc] initWithEntityName:@"Manufacture"];
[r setPredicate:[NSPredicate predicateWithFormat:@"ANY manufactures.name CONTAINS[cd] %@",searchVal]];
Si el conjunto de resultados está vacío, puede deberse al hecho de que ningún objeto responde al predicado (contiene la subcadena "tuerca").
Intente agregar algunas entidades falsas con nombres conocidos y pruebas.
Editar: este es el código que puede usar para probar:
typedef void(^config_block_t)(id);
- (void) synthesizeObjectsOfEntity:(NSString*)entity
context:(NSManagedObjectContext*)context
count:(NSUInteger)count
configBlock:(config_block_t)configBlock
{
for (;count;--count) {
NSManagedObject* object = [NSEntityDescription insertNewObjectForEntityForName:entity
inManagedObjectContext:context];
configBlock(object);
}
}
- (void) synthesizeProductsAndManufacturersInContext:(NSManagedObjectContext*)context
{
NSMutableArray* manufacturers = [NSMutableArray new];
[self synthesizeObjectsOfEntity:@"Manufactur"
context:context
count:10
configBlock:^(Manufactur* m) {
m.name = [NSString stringWithFormat:@"m-%u%u%u",arc4random()%10,arc4random()%10,arc4random()%10];
[manufacturers addObject:m];
}];
[self synthesizeObjectsOfEntity:@"Product"
context:context
count:100
configBlock:^(Product* p) {
p.name = [NSString stringWithFormat:@"p-%u%u%u",arc4random()%10,arc4random()%10,arc4random()%10];
p.manufacturedBy = manufacturers[arc4random() % [manufacturers count]];
}];
[context save:NULL];
[context reset];
NSString* searchVal = @"3";
NSFetchRequest* r = [[NSFetchRequest alloc] initWithEntityName:@"Product"];
[r setPredicate:[NSPredicate predicateWithFormat:@"manufacturedBy.name CONTAINS[cd] %@",searchVal]];
NSArray* match = [context executeFetchRequest:r error:NULL];
NSLog(@"matched: %u",[match count]);
}