2010-10-17 9 views
10

Muszę zbudować NSPredicate z wieloma kawałkami danych. Na przykład w SQL chciałbym zrobić coś jak następuje:Jaki jest najlepszy sposób na zbudowanie złożonego NSCompoundPredicate?

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 

jestem zmaga się z jak budować to jako NSPredicate do użytku z danych Core. Czytałem dokumentację ... która dostarcza tylko uproszczone przykłady. Jeśli ktokolwiek może wskazać mi bardziej złożony przykład, z pewnością to doceniam.


Cóż, od dwóch lat otrzymałem odpowiedź, która dla wielu osób okazała się pomocna. Mój wpis został usunięty. Oto zaktualizowany adres URL rozwiązania.

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

+0

Czy próbowałeś wprowadzić klauzulę where w predykacie. Ma metodę zbudowania z łańcucha, który jest dość potężny. –

+0

Nie jestem świadomy żadnego miejsca, które pozwala mi określić instrukcję SQL, która generuje predykatu. Proszę doradź. – radesix

+0

Nie wiem, dlaczego mój wpis jest ciągle usuwany. Ten artykuł pomógł WIELU ludziom http://www.radeeccles.com/convert-sql-statement-to-an-nspredicate-for-use-with-core-data/ – radesix

Odpowiedz

9

Co trzeba zrobić, to stworzyć predykatu dla każdego jednego z klauzul. Na przykład niech rozbić zapytanie:

  1. select * from TRANSAKCJI
  2. GDZIE kategorii w (categorylist)
  3. i lokalizacja IN (locationList)
  4. i wpisz (typelist)
  5. i zanotować [cd] zawiera "jakiś tekst"
  6. i godzina> = fromdate I DATY < + todate

Na tej podstawie masz 5 predykatów (2-6). Więc pracujmy nad nimi jeden po drugim.

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]; 

Teraz wystarczy połączyć je w jednym orzecznika: Apple's documentation states:

Należy zorganizować związek predykaty aby zminimalizować ilość wykonanej pracy. Dopasowywanie wyrażenia regularnego w szczególności jest kosztowną operacją . W złożonym predykacie powinieneś zatem wykonać proste testy przed zwykłym wyrażeniem;

Najpierw należy zacząć od "łatwych" predykatów. A więc:

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

Zawsze można zorientować się, jak wygląda predykat (sql where), jeśli NSLog to.

+0

Czy można odpowiedzieć [to pytanie] (https) : //stackoverflow.com/questions/46388393/create-complicated-nscompoundpredicate-in-swift-3), proszę? –

Powiązane problemy