2009-05-29 3 views
10

Meine Objektgrafik ist einfach.Core Data NSPredate für Beziehungen

Ich habe ein feedentry Objekt, das Informationen über RSS-Feeds und eine Beziehung namens Tag speichert, die mit "TagValues" -Objekt verknüpft. Beide Relationen (zu und umgekehrt) sind zu viele. ein Feed kann mehrere Tags haben und ein Tag kann mehreren Feeds zugeordnet sein.

Ich bezog mich auf How to do Core Data queries through a relationship? und erstellte einen NSFetchRequest. Aber wenn die Daten holen, bekomme ich eine Ausnahme besagt,

NSInvalidArgumentException unimplemented SQL-Generierung für Prädikat

Was soll ich tun? Ich bin ein Neuling auf Kerndaten :(Ich weiß, ich habe etwas schrecklich falsch gemacht ... Bitte helfen ...

Dank

-

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
// Edit the entity name as appropriate. 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"FeedEntry" inManagedObjectContext:managedObjectContext]; 
[fetchRequest setEntity:entity]; 
// Edit the sort key as appropriate. 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"authorname" ascending:NO]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 

[fetchRequest setSortDescriptors:sortDescriptors]; 

NSEntityDescription *tagEntity = [NSEntityDescription entityForName:@"TagValues" inManagedObjectContext:self.managedObjectContext]; 
NSPredicate *tagPredicate = [NSPredicate predicateWithFormat:@"tagName LIKE[c] 'nyt'"];   
NSFetchRequest *tagRequest = [[NSFetchRequest alloc] init]; 
[tagRequest setEntity:tagEntity]; 
[tagRequest setPredicate:tagPredicate]; 

NSError *error = nil; 
NSArray* predicates = [self.managedObjectContext executeFetchRequest:tagRequest error:&error]; 


TagValues *tv = (TagValues*) [predicates objectAtIndex:0]; 
NSLog(tv.tagName); // it is nyt here... 


NSPredicate *predicate = [NSPredicate predicateWithFormat:@"tag IN %@", predicates]; 
[fetchRequest setPredicate:predicate]; 


// Edit the section name key path and cache name if appropriate. 
// nil for section name key path means "no sections". 
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"]; 
aFetchedResultsController.delegate = self; 
self.fetchedResultsController = aFetchedResultsController; 

-

+1

Post einige Code, so dass wir einen besseren Blick – catsby

+0

Mungunth haben kann, sieht es aus wie Sie können Vergessen Sie nicht, die Entity von fetchRequest zu setzen, nachdem Sie das Prädikat auf "IN-Prädikate anpassen" gesetzt haben. Wenn dies nicht der Fall ist, posten Sie bitte auch ein Bild des Objektmodells und ich kann Ihnen ein bisschen mehr Orientierung geben. –

+0

Mugunth> Sie sollten Ihre Lösung als Antwort hinzufügen und akzeptieren. – U62

Antwort

3

Benötigen Sie SQLite? Ich bin mit einem ähnlichen Problem beschäftigt und habe festgestellt, dass alles wie erwartet mit einem binären Speicher funktioniert. Es gibt Einschränkungen bei der Verwendung von SQLite als Speicher, obwohl ich noch kein Dokument gefunden habe, das die Liste enthält Einschränkungen, nur dass sie existieren.

Sorry, ich kann nicht mehr helfen.

+0

Ja, es funktioniert mit einem binären Speicher. Ich habe eine SQL-lite-db verwendet, da es in meinem Fall schneller scheint. Ich beschäftige mich mit Daten von Größen nahe 5MB (auf iPhone). App Ladezeit ist <1 Sek für sqlite, wo es wie 2 Sekunden für binär speichern ist. – Mugunth

+1

Ich foudn die Antwort obwohl ... NSPredate * Prädikat = [NSPredicate Prädikat WithFormat: @ "Tag IN% @“, Prädikate]; [fetchRequest setPredicate: Prädikat]; sollte NSPredicate * Prädikat = [NSPredicate predicateWithFormat geändert werden: @ "ANY Tag IN% @", Prädikate]; [fetchRequest setPredicate: Prädikat ]; – Mugunth

+1

Gut zu wissen - es ist seltsam, Ihre Nachricht ist o sehr ähnlich ne ich hatte, und meine ist aufgrund einer Beschränkung der Core Data mit SQLite. Wissen, wie man den Unterschied erkennt! – emp