2010-10-17 18 views
10

Necesito construir un NSPredicate con muchos datos. Por ejemplo, en SQL me gustaría hacer algo como lo siguiente:¿Cuál es la mejor manera de construir una NSCompoundPredicate compleja?

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 

Estoy luchando con la forma de construir esto como una NSPredicate para su uso con la base de datos. He leído la documentación ... que solo proporciona ejemplos simplistas. Si alguien puede señalarme un ejemplo más complejo, ciertamente lo agradecería.


Bueno, tuve una respuesta aquí durante dos años que mucha gente encontró útil. Mi publicación fue eliminada Aquí está la URL actualizada con la solución.

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

+0

¿Intentó ingresar su cláusula where en el predicado? Tiene un método para construir uno a partir de una cadena que es bastante poderosa. –

+0

No conozco ningún lugar que me permita especificar una declaración de SQL que genere un predicado. Por favor avise. – radesix

+0

No sé por qué mi publicación sigue siendo eliminada. Este artículo ha ayudado a MUCHAS personas http://www.radeeccles.com/convert-sql-statement-to-an-nspredicate-for-use-with-core-data/ – radesix

Respuesta

9

Lo que hay que hacer es crear un predicado para cada una de sus cláusulas. Por ejemplo vamos a romper su consulta:

  1. SELECT * FROM TRANSACCIONES
  2. DONDE categoría en (categoryList)
  3. y ubicación en (locationList)
  4. y escriba (typelist)
  5. Y NOTA contiene [cd] "algún texto"
  6. Y FECHA> = fromDate Y FECHA < + tODATE

Basado en esto, tiene 5 predicados (2-6). Así que trabajemos en ellos uno por 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]; 

Ahora sólo tiene que unirse a ellos en un solo predicado: Apple's documentation states:

Usted debe estructurar compuesto predicados para reducir al mínimo la cantidad de trabajo realizado . La coincidencia de expresiones regulares en particular es una costosa operación . En un predicado compuesto, por lo tanto, debe realizar pruebas simples antes de una expresión regular;

Dicho esto, primero debe comenzar con los predicados "fáciles". Por lo tanto:

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

siempre se puede tener una idea de lo que el predicado (WHERE de SQL) se ve como si se NSLog.

+0

¿Es posible responder [esta pregunta] (https : //stackoverflow.com/questions/46388393/create-complicated-nscompoundpredicate-in-swift-3) por favor? –

Cuestiones relacionadas