realtime arquitectura objective-c database

objective-c - arquitectura - firebase swift 4



¿Hay algo similar a LINQ en Objective-C? (6)

Creo que específico para su ejemplo esto sería el equivalente en Cocoa:

NSArray *people = /* array of people objects */ NSPredicate *pred = [NSPredicate predicateWithFormat:@"Id = 1 AND Id != 2"]; NSSortDescriptor *byName = [[NSSortDescriptor alloc] initWithKey:@"Name" ascending:YES]; NSArray *descriptors = [NSArray arrayWithObject:[byName autorelease]]; NSArray *matches = [people filteredArrayUsingPredicate:pred]; NSArray *sortedMatches = [matches sortedArrayUsingDescriptors:descriptors]; NSArray *justNames = [sortedMatches valueForKey:@"Name"];

Es un poco más detallado que el ejemplo LINQ y algunas de mis líneas podrían haberse combinado, pero a mi entender esto es más fácil de analizar.

Me pregunto si es posible (y cómo) proporcionar una clase en Objective-C con algo como:

Person.Select(@"Name").OrderAsc(@"Name").Where(@"Id").EqualTo(1).And(@"Id").NotEqualTo(2).Load<Array>

Eso podría ser muy útil para un proyecto que estoy haciendo.

Me gusta esta forma de codificación presente en Django y SubSonic.


Hay una acción que compara las formas de Windows y Cocoa de hacer esto. Cocoa usa Key Paths And NSPredicate ....

Cocoa es mi novia


La respuesta corta es que no hay un equivalente a Linq para Objective-C, pero puede simularlo con una combinación de llamadas SQLite, NSPredicate y CoreData en una clase de contenedor configurada a su gusto. Probablemente le interese la guía de datos básicos , la guía de predicados y este código de ejemplo .

De la guía de predicados anterior:

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:managedObjectContext]; [request setEntity:entity]; // assume salaryLimit defined as an NSNumber variable NSPredicate *predicate = [NSPredicate predicateWithFormat: @"salary > %@", salaryLimit]; [request setPredicate:predicate]; NSError *error = nil; NSArray *array = [managedObjectContext executeFetchRequest:request error:&error];


Consulte el siguiente repositorio: https://github.com/ziminji/objective-c-sql-query-builder

Estas clases proporcionan un conjunto de métodos de conveniencia que se pueden utilizar para crear consultas SQL bien formadas rápidamente para Sqlite. Son bastante simples de usar y son relativamente sencillos ya que siguen la sintaxis SQL básica.


Creé mi propia API de estilo Linq para Objective C, que está disponible en github . Su ejemplo específico se vería así:

NSArray* results = [[[people where:^BOOL(id person) { return [person id] == 1 && [person id] != 2; }] select:^id(id person) { return [person name]; }] sort];


Mi proyecto, LINQ4Obj-C , conecta los operadores de consulta estándar de LINQ a Objective-C.

Puedes encontrarlo en github y sus documentos aquí . Esta biblioteca también está disponible a través de CococaPods .

El código fuente de este proyecto está disponible bajo la licencia estándar de MIT.

Tu ejemplo se vería así:

id results = [[[people linq_where:^BOOL(id person) { return ([person ID] == 1); }] linq_select:^id(id person) { return [person name]; }] linq_orderByAscending];

Nota : eliminé la segunda condición (ID! = 2) ya que no tiene sentido.

Por el momento, la biblioteca proporciona métodos de extensión (categorías) para las clases de recopilación, pero en el futuro también NSManagedObjectContext su funcionalidad a NSManagedObjectContext para proporcionar acceso de consulta directa a los datos principales.