/ / Problém s NSPredikátmi NSPredicate v NSFetchedResultsController - iphone, core-data

Problém s one-to-many NSPredicate v NSFetchedResultsController - iPhone, core-data

Povedzme, že mám model základných údajov, ako je tento:

položka
atribúty:
názov
typ
vzťahy:
vlastnosti

vlastnosť
atribúty:
názov
hodnota
realationships:
položka

Každá vlastnosť je spojená s jednou položkou a každá položka s mnohými vlastnosťami. Jedna nehnuteľnosť môže vyzerať úplne rovnako ako iná.

Poznám hodnotu jednej nehnuteľnosti a chcem získať hodnotu inej nehnuteľnosti z rovnakých položiek. Najprv teda načítam všetky vlastnosti s touto hodnotou.

    NSEntityDescription *propEntity = [NSEntityDescription entityForName:@"Property" inManagedObjectContext:self.managedObjectContext];
NSPredicate *propPredicate = [NSPredicate predicateWithFormat:@"name like "someName" AND value like %@", value];
NSFetchRequest *propRequest = [[NSFetchRequest alloc] init];
[propRequest setEntity:propEntity];
[propRequest setPredicate:propPredicate];
NSError *error = nil;

NSArray* properties = [self.managedObjectContext executeFetchRequest:propRequest error:&error];

To funguje dobre a v mojom poli sa zobrazuje očakávaný počet objektov. Takže teraz chcem načítať všetky položky, ktoré majú tieto vlastnosti:

    NSEntityDescription *itemEntity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:self.managedObjectContext];
NSPredicate *itemPredicate = [NSPredicate predicateWithFormat:@"type like %@ AND ANY properties in %@", @"typeValue", properties];
NSFetchRequest *itemRequest = [[NSFetchRequest alloc] init];
[itemRequest setEntity:itemEntity];
[itemRequest setPredicate:itemPredicate];

NSArray* items = [self.managedObjectContext executeFetchRequest:itemRequest error:&error];

Toto tiež funguje a dostanem očakávaný početobjekty v poli. Teraz mám svoje položky, ktoré chcem mať v týchto položkách hodnoty nehnuteľnosti s iným názvom a tu narazím na môj problém:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Property" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:20];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like "someOtherName" AND ANY item in %@", items];

[fetchRequest setPredicate:predicate];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"value" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

[fetchRequest setSortDescriptors:sortDescriptors];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:self.managedObjectContext
sectionNameKeyPath:@"value"
cacheName:@"Props"];

Teraz pole fetchedObjects FetchedResultsController obsahuje všetky vlastnosti s someOtherName, nielen iba tie, ktoré majú položku v poli items.

Niečo mi tu chýbalo? Skúšal som používať

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like "someOtherName" AND item in %@", items];

a

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like "someOtherName" AND ALL item in %@", items];

ale s rovnakým výsledkom.

Prečo nezískavam iba vlastnosti, ktoré majú položku v položkách?

Ak to pomôže, mám dotaz sql, ktorý by priniesol výsledok, ktorý hľadám:

Select distinct Property.value from Property where Property.name = "someOtherName" and property.item in (Select Property.item from Property where Property.name = "someName" and Property.value = "someValueIGetFromTheUI")

Ďakujeme vopred za každú pomoc.

odpovede:

1 pre odpoveď č. 1

Verím vášmu dotazu SQL

/*

SELECT DISTINCT Property.value
FROM Property
WHERE Property.name = "someOtherName"
AND Property.item IN (SELECT Property.item from Property where Property.name = "someName"
AND Property.value = "someValueIGetFromTheUI")
*/

Preložené do predikátu na načítanie, ktoré sa použije vo vašom FRC

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == "someOtherName" AND SUBQUERY(items, $item, $item.name == "someName" AND $item.value == %@)", value];



NSEntityDescription *propEntity = [NSEntityDescription entityForName:@"Property" inManagedObjectContext:self.managedObjectContext];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

[fetchRequest setEntity:propEntity];
[fetchRequest setReturnsDistinctResults:YES];
[fetchRequest setPredicate:predicate]; // from above

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"value" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

[fetchRequest setSortDescriptors:sortDescriptors];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"value" cacheName:@"Props"];