KEYShadow允许您以类似SQL / LINQ的方式,在类型安全的方式中使用Core Data。
KEYShadow创建键和键路径。输入为object.property1.property2时,它创建一个键路径 @"property1.property2"。您不必定义任何字符串。为了说明这非常有用,让我们更仔细地看看Core Data。
KEYShadow允许您以一种合理的方式查询核心数据,同时仍然提供NSPredicate的所有功能。为此,它创建并使用NSManagedObject子类的阴影。您不需要修改或扩展管理对象子类。
查询是通过提供三元组形成的,这些三元组被解析以构建谓词。您的查询中没有到处散布的属性路径字符串。
通过对您的语气付出很少的努力,查询既易读、类型安全,又有可重构的管理对象路径。
KEYQueryBuilder *queryBuilder;
NSArray *animalTypes = @[@"Cow", @"Dog"];
KEYDef(Animal, a$); // Shadow the Animal managed object subclass
queryBuilder = [KEYQueryBuilder select:a$
where:@[a$.name, @"contains[c]", @"Micky",
@"and not",
a$.species.simpleName, @"in", animalTypes]
order:@[a$.species.simpleName, a$.name]];
NSError *error;
NSArray *animals = [queryBuilder fetchFrom:context error:&error];
通常更方便将ManagedObjectContext和错误处理绑定到查询中,如下所示
KEYQueryContextBuilder *queryBuild = [[KEYQueryContextBuilder alloc] initWithManagedObjectContext:context
errorBlock:^(NSError *error) {
NSLog(@"error:%@", error);
}];
KeyQueryContext *query;
KEYDef(Animal, a$); // Shadow the Animal class
query = [queryBuild select:a$
where:@[a$.name, @"contains[c]", @"Micky",
a$.name, @"!=", @"Micky Duck"]
order:a$.name
limit:0
batch:10];
query.fetchRequest; // you can simply access the fetch request
NSArray *animals = [query fetch]; // or you can get the list of animals
// or you query against another managed object context
query.managedObjectContext = tmpContext
NSArray *tmpAnimals = [query fetch];
阴影提供了实体名称、属性名称和/或路径名称,用于查询函数。查询函数使用你提供的数组中的三元组形成的NSPredicates构建NSFetchRequest(你可以获取它以进一步操作)(注意:你还可以提供四个元素的数组作为"ANY"类型谓词)。
允许的组合连接符是"and","and not","or","or not"和"not"。默认组合连接符是"and",所以如果你愿意,可以省略。
你可以嵌套复合字符串来在查询中组织连接符。这是代替使用括号的做法。
添加@"desc:"在属性(或使用[KEYSort descendingDescriptor:])之前,实现降序。
如果提供的小写字符串"nil"在三元组的右侧,则将其视为nil(或使用[NSNull null])。
pod 'KEYShadow'
包含示例项目,KEYShadowExampleIOS。它还使用了KORData框架,以简化NSFetchedResultsControllers。
很多!但包括以下内容:
存在一个类别NSObject+KEYShadow,它有一个名为"key_$"的单个类级别方法。这允许您选择性地通过以下方式内联操作:
// Experimenting with a category on NSObject with a class method key_$
KEYQueryBuilder *qb;
qb = [KEYQueryBuilder select:Animal.key_$
where:nil
order:@[@"desc:", Animal.key_$.name]];
类似于以下内容:
// format of select clause is -
// entity: a$
// group by attributes: a$.species
// aggregate attributes (in pairs): @"min:", a$.$dob
// when run, this creates an ordered array of dictionaries
KEYDef(Animal, a$);
[KEYQueryBuilder select:@[a$, a$.species, @"min:", a$.dob]
where:@[a$.farm.age, @"!=", @"nil"]
order:@[@"desc[n]:", a$.species]];
在WHERE子句中添加"having"作为一个连接词以允许使用HAVING子句。唯一的问题是,似乎只有使用"sum:"的HAVING子句才能正常工作。没有文档表明原因。
// 您可以这样做:NSArray *查询结果 = [查询从:数组中取得];
使用字符串作为字典键是正常的,但如果你打错了字符串,可能会有些烦恼。您可以使用不变字符串,但它们不太模块化,并且只支持路径约定。相反,假设您有一个People类,具有各种类型的各种属性。您可以直接使用此类作为键路径如下:
KEYDef(People, people$); // Shadow the People class
NSDictionary *dictionary = @{
people$.name : @"Joe Bloggs",
people$.address.street: @"Downing St"
};
NSString *whatsTheStreet = dictionary[people$.address.street]; // @"Downing St"