CrystDB is a thread-safe and convenient Object Relational Mapping database that based on SQLite.
📖 English Documentation | 📖 中文文档
CrystDB 是一个线程安全的对象映射(ORM)数据库,并基于SQLite实现,框架轻量简便、性能高,对于简单模型数据的操作速度要比Realm快很多,是Realm以及CoreData的替代之选。
处理 GithubUser 数据 2000 次耗时统计 (iPhone 6s):
// 初始化一个默认的数据库:
CrystManager *db = [CrystManager defaultCrystDB];
// 初始化一个名字为`Person`数据库:
CrystManager *db = [[CrystManager alloc] initWithName:@"Person"];
// Person Model
@interface Person : NSObject <CrystDB>
@property (nonatomic,assign) UInt64 uid;
@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) NSInteger age;
@end
@implementation Person
@end
// 生成Person 对象:
Person *p = [[Person alloc] init];
p.uid = 8082;
p.name = @"Ares";
p.age = 27;
// 存储Person对象,如果已经存在该Person对象,则执行更新操作:
BOOL result = [db addOrUpdateObject:p];
// 存储Person对象,如果已经存在该Person对象,则不做处理:
BOOL result = [db addOrIgnoreObject:p];
// 如果已知该对象已存在于数据库中,并且Person对象实现了`CrystDBPrimaryKey`方法,可以直接更新对象(否则建议使用addOrUpdateObject:方法):
BOOL result = [db updateObject:p];
// 使用事务
[db inTransaction:^(BOOL * _Nonnull rollback) {
BOOL result = [db addOrUpdateObject:p];
if (result == NO) {
*rollback = YES;
}
}];
// 查询Person类对象:
NSArray *persons = [db queryWithClass:[Person class] condition:nil];
// 使用条件检索,查询Person类对象组:
NSArray *persons = [db queryWithClass:[Person class] condition:@"age > 25 or name == 'Ares' "];
// 或者使用格式化参数检索,查询Person类对象组:
NSArray *persons = [db queryWithClass:[Person class] conditions:@"age > %d or name == '%@' ",25,@"Ares"];
// 或者使用SQL的提哦按建检索,查询Person类对象数组:
NSArray *persons = [db queryWithClass:[Person class] where:@"age > 8082" orderBy:@"uid desc" limit:@"1,10"];
// 使用条件检索,删除Person类中的对象:
BOOL result = [db deleteClass:[Person class] where:@"name = 'Ares' "];
// 删除Person类中所有的对象:
BOOL result = [db dropClass:[Person class]];
// 删除数据库中所有的对象:
BOOL result = [db dropAll];
// 删除的对象,需要实现了`CrystDBPrimaryKey`方法,否则p对象的所有属性值都和数据库中的对象完全相同,否则无法找到并删除该对象:
BOOL result = [db deleteObject:p];
// 设置主键,用于标识对象的唯一性:
+ (NSString *)CrystDBPrimaryKey{
return @"uid";
}
// 在对象中实现下面方法,操作对象时采用默认该数据库:
+ (NSString *)CrystDBName{
return @"child.db";
}
// 设置执行数据库操作的字段白名单:
+ (NSArray<NSString *> *)CrystDBWhitelistProperties{
return @[@"age"];
}
// 设置执行数据库操作的字段黑名单:
+ (NSArray<NSString *> *)CrystDBBlacklistProperties{
return @[@"uid",@"name",@"age"];
}
// 如果对象是继承关系,需要解析并操作父类的元素,实现以下方法:
+ (BOOL)CrystDBObjectIsHasSuperClass{
return YES;
}
// 如果存储的对象中,嵌套子对象属性,推荐使用`CSModel`,并实现以下Coding方法:
- (void)encodeWithCoder:(NSCoder *)aCoder{
[self cs_encode:aCoder];
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
return [self cs_decoder:aDecoder];
}
// 存储对象,如果已存在该对象则执行更新操作
BOOL result = [p cs_addOrUpdateToDB];
// 存储对象,如果已存在该对象则不处理
BOOL result = [p cs_addOrIgnoreToDB];
// 按条件检索,查询该类的对象
Person *p = [Person cs_queryObjectsWithCondition:@"age > 25"];
// 根据主键来查询对象,对象必须实现了`CrystDBPrimaryKey`方法
Person *p = [Person cs_queryObjectOnPrimary:@"8082"];
// 查询该类对象在数据库的总数
NSInteger count = [Person cs_queryObjectCount];
// 查询对象在数据库中创建时间
NSInteger createTime = [p cs_queryObjectCreateTime];
// 查询对象在数据库中更新时间
NSInteger updateTime = [p cs_queryObjectUpdateTime];
// 根据条件检索,删除该类的所有对象
[Person cs_deleteFromDBWithCondition:@"name = 'Ares' "];
// 从数据库中删除所有对象
BOOL result = [p cs_deleteFromDB];
// 使用事务方法,操作数据库
[Person cs_inTransaction:^(CrystDB *db, BOOL *rollback) {
BOOL result = [db addOrUpdateObject:p];
if (result == NO) {
*rollback = YES;
}
}];
pod 'CrystDB'
pod install
或 pod update
CrystDB 使用 MIT 许可证,详情见 LICENSE 文件。