Iphone NSPredifichi come fare un INNER JOIN?
-
10-07-2019 - |
Domanda
Ho cercato attraverso la documentazione e alcuni altri post in questo sito, ma semplicemente non riesco a capire come risolverlo, che in realtà è molto semplice in SQL.
Fondamentalmente ho 2 entità Strumenti e offerte. E il " Affari " usa uno "strumento" per eseguire l'operazione desiderata. Ora voglio elencare gli attributi delle offerte e gli attributi dello strumento utilizzati per questa offerta. Quindi in SQL farei:
SELEZIONA * DA strumenti Offerte JOIN INNER ON Instruments.ID = Deals.InstrumentID
Come potrei farlo con un NSPredicate ?. Qualsiasi aiuto sarà molto apprezzato. Grazie.
-Oscar
Soluzione
Per prima cosa, dovresti fare il possibile per uscire dalla mentalità SQL. I dati di base non sono un ORM. È un framework di gestione dei grafici a oggetti che accade per usare SQLite come possibile backend di persistenza. Sebbene sia possibile visualizzare l'SQL che utilizza tramite le variabili di ambiente (per il debug), l'SQL è un dettaglio dell'implementazione privata. I dati di base avrebbero potuto essere implementati senza alcun SQL.
Quindi, cerca di non pensare in termini di tabelle db. Hai una raccolta di istanze Deal
. Vuoi le loro proprietà? Usa Codifica valore-chiave per ottenere le proprietà di tali istanze e le relative istanze Instrument
. Supponendo che tu abbia un'istanza NSSet
di Deals
, chiamata affare
:
[deals valueForKey:@"dealProperty"];
ti darà un NSSet
dei valori di dealProperty
da ciascuna istanza di Deal
. Se si desidera ottenere più proprietà contemporaneamente, è possibile utilizzare - [NSObject (NSKeyValueCoding) dizionarioWithValuesForKeys:]
. Puoi ottenere solo le chiavi " un livello profondo " utilizzando questo metodo, quindi solo, ad es. 'dealProperty1', 'dealProperty2' ma non 'dealRelation.relationProperty' o 'dealRelation. @ count'.
Per ottenere " nidificato " proprietà, basta usare un percorso chiave:
[deals valueForKeyPath:@"instrument.instrumentProperty"];
ti fornirà un insieme di valori di instrumentProperty
dell'istanza Instrument
associata a ciascuna istanza Deal
, assumendo strumento
è una relazione uno a uno da Deal
a Instrument
. Se la relazione è da uno a molti, otterrai una serie di insiemi di valori instrumentProperty
.
Puoi sempre farlo in modo più esplicito (ovviamente questo codice non fa nulla e non è nemmeno sintatticamente corretto da quando ho omesso punti e virgola ecc., ma mostra il contorno):
for(Deal *deal in deals) {
//use attribute access to get properties of deal and associated instrument
deal.dealProperty
deal.instrument.instrumentProperty //for one-to-one
for(Instrument *instrument in deal.instruments) { //for one-to-many instruments
instrument.instrumentProperty;
}
}
utilizzando l'enumerazione delle raccolte appropriate.