2013-01-19 6 views

risposta

15

Per una proprietà recuperata users di Luogo che recupera tutti gli utenti il ​​cui check-in è legato al luogo determinato , impostare

  • la destinazione della proprietà azzardato "utente"
  • e il predicato di "ANY checkins.event == $ FETCH_SOURCE"

enter image description here

Ora è possibile ottenere la matrice di utenti per un posto:

Place *place = ...; 
NSArray *users = [place valueForKey:@"users"]; 

Questa struttura inverosimile corrisponde al seguente prendere richiesta:

Place *place = ...; 
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"User"]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY checkins.event == %@", place]; 
[request setPredicate:predicate]; 
NSArray *users = [context executeFetchRequest:request error:&error]; 

Se si dichiara la proprietà recuperata users come proprietà dinamica:

@interface Place (FetchedProperties) 
@property(nonatomic, retain) NSArray *users; 
@end 

@implementation Place (FetchedProperties) 
@dynamic users; 
@end 

allora è possibile recuperare il valore utilizzando la sintassi di proprietà:

NSArray *users = place.users; 
// instead of: NSArray *users = [place valueForKey:@"users"]; 

Ma nota che si può ottenere lo stesso risultato (come insieme) direttamente, senza l'utilizzo di una proprietà inverosimile:

Place *place = ...; 
NSSet *users = [place.checkins valueForKey:@"user"]; 
+0

Se si desidera ordinare l'utente in base alla proprietà created_at di Checkin, come impostare una chiave descrittore di ordinamento? – Subhash

+0

@Subhash: Non penso che sia possibile aggiungere un descrittore di ordinamento a una proprietà recuperata, è necessario ordinare l'array degli utenti dopo averlo scaricato. - Oppure si utilizza una normale richiesta di recupero in cui è possibile aggiungere un descrittore di ordinamento. –

+0

Grazie per la risposta. Ho un modello simile a quello sopra menzionato e utilizzo il controller fetch per recuperare i dati. Quando imposto la chiave di ordinamento come created_at, ottengo un errore come "Exception = to-many key not allowed here". Si tratta di una limitazione con il controller Fetch? La soluzione sopra menzionata (senza usare il controller fetch) è l'unico modo per risolvere questo problema? – Subhash

2

Spero di aver capito bene. Vuoi un elenco di utenti che hanno effettuato il check-in in un determinato luogo?

Poi lo fai il contrario. Si prelevano tutti i User s che hanno almeno uno Checkin con un determinato Place.

In termini di Core-Data avrete bisogno di una subquery per questo.

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"User"]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(checkins, $CHECKIN, $CHECKIN.event == %@)[email protected] > 0", place]; 
request.predicate = predicate; 
/* and so on */ 

Non c'è molta documentazione su SUBQUERY. Un po 'è scritto nella discussione di expressionForSubquery:usingIteratorVariable:predicate:.

e la proprietà inverosimile sarebbe nell'entità posto con un utente dell'entità di destinazione e il predicato SUBQUERY(checkins, $CHECKIN, $CHECKIN.event == $FETCH_SOURCE)[email protected] > 0

Problemi correlati