YapModel 1.1.0

YapModel 1.1.0

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布上次发布2016年6月

Francis Chong维护。



 
依赖
YapDatabase>= 2.8.3
AutoCoding~> 2.2
libextobjc>= 0
 

YapModel 1.1.0

YapModel是用于处理YapDatabase的DSL。语法借用自Ruby on Rails,并受到ObjectiveRecord的启发。

先决条件

在使用此库之前,您需要了解YapDatabase是如何工作的

概要

使用DSL定义您的类

@interface Car : YapModelObject
@property (nonatomic, copy) NSString* name;
@property (nonatomic, assign) NSUInteger year;
@property (nonatomic, assign) CGFloat price;

// create an index named "CarYearIndex"
@index(Car, CarYearIndex, @"year": @(YapDatabaseSecondaryIndexTypeInteger));

// create a view named "CarByYear"
@view(Car, CarByYear, @"group": @"year", @"sort": @"year");

// create relationships
@hasMany(Driver, carsKey, cars, YDB_DeleteDestinationIfSourceDeleted);

@end

当应用初始化时,设置数据库

YapDatabase* database = ... // create the database
[YapModel setupDatabase:database];

创建 / 保存 / 删除

[connection readWriteTransaction:^(YapDatabaseReadWriteTransaction* transaction){
    Person* john = [Person create];
    john.name = @"John";
    [john saveWithTransaction:transaction];
    [john deleteWithTransaction:transaction];

    [Person create:@{
      @"name": @"John",
      @"age": @12,
      @"member": @NO
    } withTransaction:transaction];
}];

查找器

[connection readWriteTransaction:^(YapDatabaseReadWriteTransaction* transaction){
  // Find all objects
  NSArray* people = [Person allWithTransaction:transaction];

  // Get an object by key
  Person* john = [Person find:@"uuid" withTransaction:transaction];

  // Iterate with all objects and find the object matching the filter
  NSArray* people = [Person where:^BOOL(Person* person) {
      return person.age < 30;
  } withTransaction:transaction];

  // Find using Secondary Index
  Person *johnDoe = [Person findWithIndex:@"idx"
                                    query:[YapDatabaseQuery queryWithFormat:@"WHERE name == ? AND surname == ?", @"John", @"Doe"]
                          withTransaction:transaction];
}];

聚合

[connection readWriteTransaction:^(YapDatabaseReadWriteTransaction* transaction){
  // count all Person entities
  NSUInteger personCount = [Person countWithTransaction:transaction];

  // count people named John
  NSUInteger johnCount = [Person countWithIndex:@"index"
                                          query:[YapDatabaseQuery queryWithFormat:@"WHERE name = 'John'"]
                                withTransaction:transaction];
}];

索引

创建简单索引

@interface Car : YapModelObject
@property (nonatomic, copy) NSString* name;
@property (nonatomic, assign) CGFloat price;
@property (nonatomic, assign) NSInteger year;

// text index
@indexText(Car, CarNameIndex, @"name");

// integer index
@indexInteger(Car, CarAgeIndex, @"year");

// real number index
@indexReal(Car, CarPriceIndex, @"price");

// index with multiple fields
@indexInteger(Car, CarAgeMemberIndex, @"year", @"price");

// index with multiple fields and type
@index(Car, CarAgePriceIndex, @"year": @(YapDatabaseSecondaryIndexTypeInteger), @"price": @(YapDatabaseSecondaryIndexTypeReal));

@end

视图

创建简单视图

@interface Car : YapModelObject
@property (nonatomic, copy) NSString* name;
@property (nonatomic, assign) CGFloat price;
@property (nonatomic, assign) NSInteger year;

// define a view by grouping and sorting using name
@view(Car, CarByName, @"group": @"name", @"sort": @"name");

// or you can use multiple sorting / grouping fields
@view(Car, CarByYear, @"group": @[@"year"], @"sort": @[@"year", @"name"]);

@end

关系

配置关系

@interface Driver : YapModelObject
@property (nonatomic, strong) NSString* name;

// Has many.
// Add a NSArray* property "cars", and setup yapDatabaseRelationshipEdges to return proper edges
@hasMany(Driver, carsKey, cars, YDB_DeleteDestinationIfSourceDeleted);

// Has one.
// add a NSString* property "companyKey", and setup yapDatabaseRelationshipEdges to return proper edges
@hasOne(Driver, licenseKey, license, YDB_DeleteDestinationIfSourceDeleted);

// Belongs to
// add a NSString* property "companyKey", and setup yapDatabaseRelationshipEdges to return proper edges
@belongsTo(Driver, companyKey, company, YDB_DeleteDestinationIfSourceDeleted);

// Has one file
// add a NSString* property "pictureFilePath", and setup yapDatabaseRelationshipEdges to return proper edges
@hasOneFile(Driver, pictureFilePath, picture, YDB_DeleteDestinationIfSourceDeleted);

@end

NSCoding

YapModel包含AutoCoding以实现自动NSCoding。它应该按预期工作,但您应该查看AutoCoding以了解其工作原理,并在需要时重写NSCoding/NSCopying方法。

许可证

MIT许可证。