测试已测试 | ✓ |
语言语言 | Obj-CObjective C |
许可证 | MIT |
发布时间最近发布 | 2016年5月 |
由 Aleksei Shevchenko 维护。
依赖关系 | |
YapDatabase/SQLCipher | ~> 2.9 |
AutoCoding | ~> 2.2 |
libextobjc | >= 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");
// define a view by grouping and sorting using name (reverse sort)
@view(Car, CarByName, @"group": @"name", @"sort": @"-name");
// or you can use multiple sorting / grouping fields
@view(Car, CarByYear, @"group": @[@"year"], @"sort": @[@"year", @"name"]);
// sort by year in descending order, then by name
@view(Car, CarByYear, @"group": @[@"year"], @"sort": @[@"-year", @"name"]);
//create YapSearchResultsView, based on CarByName, and make "name" searchable
@searchView(Car, CarViewNameSearch, @"parent": @"CarByName", @"properties": @[@"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
YapModel 包含来自 AutoCoding 的自动 NSCoding。这应该可以正常工作,但如果需要,您应该检查 AutoCoding 并覆盖 NSCoding/NSCopying 方法。
MIT 许可证。