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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top