2016-08-26 2 views
2

Ich versuche, eine NSPredicate für eine NSFetchResultsController Ich bin in einer UITableView verwenden. Ich habe 3 Einheiten, User (1 zu viele) ->Visit (1 zu viele) ->Treatment, und möchten alle Behandlungen, die ein Benutzer hat.NSPredicate für eine NSFetchResultsController

Ich habe versucht, Unterabfragen, SELF, ANY, und nur als eine Rückkehr der Visits und nicht die Treatments zu bekommen.

Könnte mir bitte jemand sagen, wie ich auf die Behandlungseinheiten von den Benutzereinheiten zugreifen kann?

Vielen Dank im Voraus für jede Hilfe!

Image of the CoreData Model

EDIT

Dies ist der Code, den ich zur Zeit die Behandlungen

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:kTreatmentVisits]; 
fetchRequest.sortDescriptors = descriptors; 
fetchRequest.fetchBatchSize = 10; 
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"ANY treatmentVisits = %@.visitTreatment", user.userVisit]; 

Als Ergebnis ich die Besuche bekommen, nicht die Behandlungen

zu versuchen und holen bin mit
<NSFetchRequest: 0x60b000148a40> (entity: treatmentVisits; predicate: (ANY treatmentVisits == {<Visits: 0x60b0000a0ad0> (entity: VisitsEntity; id: 0xd0000000000c000a <x-coredata://5CDB188C-2177-415B-9B74-E30B20EA4DAA/VisitsEntity/p3> ; data: { 
visitCause = ""; 
visitEndDate = nil; 
visitId = nil; 
visitRecommendation = ""; 
visitStartDate = "2016-08-11 04:43:50 +0000"; 
visitTreatment = "<relationship fault: 0x60300025e6d0 'visitTreatment'>"; 
visitType = 0; 
visitUser = "0xd000000001940000 <x-coredata://5CDB188C-2177-415B-9B74-E30B20EA4DAA/UsersEntity/p101>"; 
}), <Visits: 0x60b0000bec10> (entity: VisitsEntity; id: 0xd00000000008000a <x-coredata://5CDB188C-2177-415B-9B74-E30B20EA4DAA/VisitsEntity/p2> ; data: { 
visitCause = ""; 
visitEndDate = nil; 
visitId = nil; 
visitRecommendation = ""; 
visitStartDate = "2016-08-04 20:26:33 +0000"; 
visitTreatment = "<relationship fault: 0x60300025e850 'visitTreatment'>"; 
visitType = 0; 
visitUser = "0xd000000001940000 <x-coredata://5CDB188C-2177-415B-9B74-E30B20EA4DAA/UsersEntity/p101>"; 
}), <Visits: 0x60b000148570> (entity: VisitsEntity; id: 0xd00000000010000a <x-coredata://5CDB188C-2177-415B-9B74-E30B20EA4DAA/VisitsEntity/p4> ; data: <fault>), <Visits: 0x60b000148620> (entity: VisitsEntity; id: 0xd00000000004000a <x-coredata://5CDB188C-2177-415B-9B74-E30B20EA4DAA/VisitsEntity/p1> ; data: <fault>)}.visitTreatment); sortDescriptors: ((
"(treatmentStartTime, descending, compare:)" 
)); batch size: 10; type: NSManagedObjectResultType;) 

Ich möchte in der Lage sein, den Zugriff auf, was in visitTreatment ist

Ich habe auch versucht,

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", user.userVisit]; 

mit dem gleichen Ergebnis.

+1

Wäre schön, wenn Sie die Anfragen und Prädikate gepostet haben, die Sie bereits ausprobiert haben. –

+0

Hallo @FelipeCypriano, ich habe den Beitrag mit dem Code, den ich verwendet habe, und dem Code, den ich verwende, mit dem Ergebnis aktualisiert, das er mir gegeben hat. – Armando

+0

Das Protokoll, das Sie zur Verfügung gestellt haben, scheint die Ausgabe zu sein, die von der Abrufanforderung protokolliert wird, und nicht von den Ergebnissen der Ausführung des Abrufs. Siehe meine aktualisierte Antwort unten. – pbasdf

Antwort

2

Erstens, wenn Sie die Behandlungen erhalten möchten, die zugrunde liegende für Ihre FRC holen müssen die Behandlungen Einheit angeben:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"TreatmentsEntity"]; 

Dann für eine gegebene UsersEntity die Ergebnisse zu den Behandlungen begrenzen, sagen requiredUser, durch die Angabe Prädikat:

fetchRequest.predicate = [NSPredicate predicateWithFormat:"treatmentVisits.visitUser == %@", requiredUser]; 

Sie müssen dann die Abrufanforderung auszuführen, entweder direkt:

NSError *error = nil; 
NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
if (results == nil) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort();  
} else { 
    NSLog(@"Results is %@",results); 
} 

oder für einen abgerufenen Ergebnisse Controller, initialisieren Sie die FRC mit Ihrem fetchRequest und dann performFetch nennen:

NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil]; 
NSError *error = nil; 
if (![frc performFetch:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} else { 
    NSLog(@"Results %@",frc.fetchedObjects); 
} 
+0

Danke für die Antwort. Ich habe es versucht, aber die Antwort war der Benutzer und nicht die Behandlungen. – Armando

+0

Neugierig. Bitte zeigen Sie den vollständigen Code für Ihre Abrufanforderung und den Code und die Ausgabe, bei der Sie die Ergebnisse protokollieren. (Ihre Frage zeigt das Protokoll der Abrufanforderung, nicht die Ergebnisse der Abrufanforderung.) – pbasdf

+0

Vielen Dank @pbasdf, ich habe die falsche Variable verwendet und zu früh überprüft. Das habe ich mit deiner Antwort gesehen. Prost! – Armando

0

Sie benötigen Treatment als Einheit geholt werden zu verwenden. Die Referenz zwei Ebenen bis zum Benutzer sollte trivial sein, weil die umgekehrten Beziehungen zu eins sind.

Die richtige Prädikat würde so etwas wie

NSPredicate(format: "visit.user = [email protected]", user) 

Ihre Protokolle zeigen, dass Sie Besuche zu holen, nicht-Behandlungen.