2010-10-17 48 views
10

Devo creare un NSPredicate con molti dati. Per esempio in SQL vorrei fare qualcosa di simile al seguente:Qual è il modo migliore per costruire un NSCompoundPredicate complesso?

SELECT * 
    FROM TRANSACTIONS 
    WHERE CATEGORY IN (categoryList) 
    AND LOCATION IN (locationList) 
    AND TYPE IN (typeList) 
    AND NOTE contains[cd] "some text" 
    AND DATE >= fromDate 
    AND DATE <+ toDate 

sto lottando con il modo di costruire questo come NSPredicate per l'uso con Core Data. Ho letto la documentazione ... che fornisce solo esempi semplicistici. Se qualcuno può indicarmi un esempio più complesso, lo apprezzerei sicuramente.


Bene, ho avuto una risposta qui per due anni che molte persone hanno trovato utili. Il mio post è stato cancellato Ecco l'URL aggiornato con la soluzione.

https://www.radeeccles.com/convert-sql-statement-to-an-nspredicate-for-use-with-core-data/

+0

Si è tentato di immettere la clausola where nel predicato. Ha un metodo per costruirne uno da una stringa che è piuttosto potente. –

+0

Non sono a conoscenza di alcuna posizione che mi consente di specificare un'istruzione SQL che genera un predicato. Si prega di avvisare. – radesix

+0

Non so perché il mio post continua a essere cancellato. Questo articolo ha aiutato MOLTE persone http://www.radeeccles.com/convert-sql-statement-to-an-nspredicate-for-use-with-core-data/ – radesix

risposta

9

Quello che dovete fare è creare un predicato per ognuno dei tuoi clausole. Per esempio cerchiamo di abbattere la vostra richiesta:

  1. SELECT * FROM TRANSAZIONI
  2. DOVE CATEGORIA IN (CategoryList)
  3. E LOCAZIONE IN (locationList)
  4. e digitare (TypeList)
  5. E NOTA contiene [cd] "del testo"
  6. E DATA> = fromdate E DATA < + tODATE

In base a ciò, si hanno 5 predicati (2-6). Quindi lavoriamo su di loro uno per uno.

NSPredicate *inCategoryPredicate = [NSPredicate predicateWithFormat:@"Category IN %@", categoryList]; 

NSPredicate *locationPredicate = [NSPredicate predicateWithFormat:@"Location IN %@", locationList]; 

NSPredicate *typePredicate = [NSPredicate predicateWithFormat:@"Type IN %@", typeList]; 

NSPredicate *notePredicate = [NSPredicate predicateWithFormat:@"Note contains[c] %@", @"Some Text"]; 

NSPredicate *startDatePredicate = [NSPredicate predicateWithFormat:@"Date => @", fromDate]; 

NSPredicate *endDatePredicate = [NSPredicate predicateWithFormat:@"Date <= @", toDate]; 

Ora è solo bisogno di unirsi a loro in un solo predicato: Apple's documentation states:

Si dovrebbe strutturare composto predicati per ridurre al minimo la quantità di lavoro svolto. In particolare, l'abbinamento di espressioni regolari è un'operazione costosa . In un predicato composto, è necessario eseguire quindi i test semplici prima di un'espressione regolare;

Detto questo, si dovrebbe iniziare prima con i predicati "facili". Quindi:

NSCompoundPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects: startDatePredicate, endDatePredicate, inCategoryPredicate, locationPredicate, typePredicate, notePredicate]; 

si può sempre avere un'idea di ciò che il predicato (sql dove) si presenta come se si NSLog esso.

+0

È possibile rispondere a [questa domanda] (https : //stackoverflow.com/questions/46388393/create-complicated-nscompoundpredicate-in-swift-3) per favore? –

Problemi correlati