KEYShadow 0.2.0

KEYShadow 0.2.0

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布日期最近发布2014年12月

Oliver Staats维护。



KEYShadow 0.2.0

  • 作者:
  • olistaats

关于

KEYShadow允许您以类似SQL / LINQ的方式,在类型安全的方式中使用Core Data。

KEYShadow创建键和键路径。输入为object.property1.property2时,它创建一个键路径 @"property1.property2"。您不必定义任何字符串。为了说明这非常有用,让我们更仔细地看看Core Data。

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

它是如何工作的

  • 通过Xcode创建NSManagedObject子类
  • 通过导入"KEYAll.h",使用KEYDef宏添加阴影。这只是一个用于隐藏阴影对象实现的简单包装。

阴影提供了实体名称、属性名称和/或路径名称,用于查询函数。查询函数使用你提供的数组中的三元组形成的NSPredicates构建NSFetchRequest(你可以获取它以进一步操作)(注意:你还可以提供四个元素的数组作为"ANY"类型谓词)。

允许的组合连接符是"and","and not","or","or not"和"not"。默认组合连接符是"and",所以如果你愿意,可以省略。

你可以嵌套复合字符串来在查询中组织连接符。这是代替使用括号的做法。

添加@"desc:"在属性(或使用[KEYSort descendingDescriptor:])之前,实现降序。

如果提供的小写字符串"nil"在三元组的右侧,则将其视为nil(或使用[NSNull null])。

如何获取(PODS)

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子句才能正常工作。没有文档表明原因。

增强的排序子句

  • @"[c]:"将添加不区分大小写的排序。
  • @"[cd]:"将添加带变音符号的不区分大小写的排序。
  • @"[n]"使用本地化标准比较。
  • @"desc:"将以降序排序,可以有一个括号后缀(例如:"desc[n]:")

数组

// 您可以这样做:NSArray *查询结果 = [查询从:数组中取得];

  • 目前,这忽略了SELECT子句,因此没有分组或聚合。

字典

使用字符串作为字典键是正常的,但如果你打错了字符串,可能会有些烦恼。您可以使用不变字符串,但它们不太模块化,并且只支持路径约定。相反,假设您有一个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"