https://github.com/chasel-shao/crystdb
CrystDB is a thread-safe and convenient Object Relational Mapping database that based on SQLite.
https://github.com/chasel-shao/crystdb
model objective-c runtime sqlite-database
Last synced: 10 months ago
JSON representation
CrystDB is a thread-safe and convenient Object Relational Mapping database that based on SQLite.
- Host: GitHub
- URL: https://github.com/chasel-shao/crystdb
- Owner: Chasel-Shao
- License: mit
- Created: 2017-06-30T06:41:45.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2017-08-17T14:10:47.000Z (over 8 years ago)
- Last Synced: 2024-09-12T22:42:15.935Z (over 1 year ago)
- Topics: model, objective-c, runtime, sqlite-database
- Language: Objective-C
- Homepage:
- Size: 90.8 KB
- Stars: 145
- Watchers: 2
- Forks: 6
- Open Issues: 0
-
Metadata Files:
- Readme: README-CN.md
- License: LICENSE
Awesome Lists containing this project
README
CrystDB
==============
[](https://raw.githubusercontent.com/Chasel-Shao/CrystDB/master/LICENSE)
[](http://cocoapods.org/pods/CrystDB)
[:book: English Documentation](README.md) | :book: 中文文档
基础简介
==============
CrystDB 是一个线程安全的对象映射(ORM)数据库,并基于SQLite实现,框架轻量简便、性能高,对于简单模型数据的操作速度要比Realm快很多,是Realm以及CoreData的替代之选。
性能比较
==============
处理 GithubUser 数据 2000 次耗时统计 (iPhone 6s):

功能特性
==============
- **简洁轻量**: 源码文件少,操作方法简单方便
- **无侵入性**: 无需继承自其他基类和使用其他辅助类
- **存储支持**: 存储类型支持大多数Objective-C类型和C类型
- **类型安全**: 检查每个对象类型,能安全的在SQlite类型之间转换
- **高性能**: 存储速度快,对简单模型对象的存储速度是Realm的2-4倍;2000次的对象查询速度也比Realm快
使用方法
==============
### 创建或打开数据库
```objc
// 初始化一个默认的数据库:
CrystManager *db = [CrystManager defaultCrystDB];
// 初始化一个名字为`Person`数据库:
CrystManager *db = [[CrystManager alloc] initWithName:@"Person"];
```
### 插入和更新对象
```objc
// Person Model
@interface Person : NSObject
@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;
}
}];
```
### 查询对象操作
```objc
// 查询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"];
```
### 删除对象操作
```objc
// 使用条件检索,删除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];
```
### 协议方法的使用
```objc
// 设置主键,用于标识对象的唯一性:
+ (NSString *)CrystDBPrimaryKey{
return @"uid";
}
// 在对象中实现下面方法,操作对象时采用默认该数据库:
+ (NSString *)CrystDBName{
return @"child.db";
}
// 设置执行数据库操作的字段白名单:
+ (NSArray *)CrystDBWhitelistProperties{
return @[@"age"];
}
// 设置执行数据库操作的字段黑名单:
+ (NSArray *)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];
}
```
### 使用方便简洁的分类方法
```objc
// 存储对象,如果已存在该对象则执行更新操作
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;
}
}];
```
集成
==============
### CocoaPods
1. 在 Podfile 中添加 `pod 'CrystDB'`
2. 执行 `pod install` 或 `pod update`
3. 导入 \
### 手动安装
1. 下载 CrystDB
2. 手动导入 CrystDB.h 及其源码文件
作者
==============
- [Chasel-Shao](https://github.com/Chasel-Shao)
许可证
==============
CrystDB 使用 MIT 许可证,详情见 LICENSE 文件。