一個對FMDB進(jìn)行類Hibernate封裝的iOS庫琢唾,支持Objective-C 和 Swift玖雁。
GitHub: https://github.com/scubers/JRDB
Feedback: jr-wong@qq.com
Description
- 使用分類的模式抽碌,模仿Hibernate,對FMDB進(jìn)行簡易封裝
- 支持pod 安裝 『pod 'JRDB'』祖娘,Podfile需要添加 use_framework!
- 使用協(xié)議,不用繼承基類较剃,對任意NSObject可以進(jìn)行入庫操作
- 支持swift 和 Objective-C
- 支持?jǐn)?shù)據(jù)類型:基本數(shù)據(jù)類型(int,double技健,等)写穴,String,NSData雌贱,NSNumber啊送,NSDate
- 注:swift的基本數(shù)據(jù)類型,不支持Option類型欣孤,既不支持Int馋没?Int!等降传,對象類型支持Option類型
Installation 【安裝】
use_frameworks!
pod 'JRDB'
@import JRDB;
Usage
Save 【保存】
- OC
Person *p = [[Person alloc] init];
p.a_int = 1;
p.b_unsigned_int = 2;
p.c_long = 3;
p.d_long_long = 4;
p.e_unsigned_long = 5;
p.f_unsigned_long_long = 6;
p.g_float = 7.0;
p.h_double = 8.0;
p.i_string = @"9";
p.j_number = @10;
p.k_data = [NSData data];
p.l_date = [NSDate date];
[p jr_save];
-
Swift
- Swift中需要入庫的類需要繼承NSObject(使用到runtime)
- The Object that you want to persistent should inherit from NSObject
let p = Person()
p.name = "name"
p.age = 10
p.birthday = NSDate()
p.jr_save()
Update 【更新】
Person *p = [Person jr_findAll].firstObject;
p.name = @"abc";
[p jr_update columns:nil];
column: 需要更新的字段名篷朵,傳入空為全量更新
--
Delete 【刪除】
Person *p = [Person jr_findAll].firstObject;
[p jr_delete];
--
Select 【查找】
- 常規(guī)查找
Person *P = [Person jr_findByID:@"111"];
NSArray *list = [Person jr_findAll];
NSArray *list1 = [Person jr_findAllOrderBy:@"_age" isDesc:YES];
- 條件查詢
NSArray *condis = @[
[JRQueryCondition condition:@"_l_date < ?" args:@[[NSDate date]] type:JRQueryConditionTypeAnd],
[JRQueryCondition condition:@"_a_int > ?" args:@[@9] type:JRQueryConditionTypeAnd],
];
NSArray *arr = [Person jr_findByConditions:condis
groupBy:@"_room"
orderBy:@"_age"
limit:@" limit 0,13 "
isDesc:YES];
- SQL
NSString *sql = @"select * from Person where age = ?";
NSArray *list = [Person jr_executeSql:sql args:@[@10]];
Other 【其他】
協(xié)議:JRPersistent
@protocol JRPersistent <NSObject>
@required
- (void)setID:(NSString *)ID;
- (NSString *)ID;
@optional
/**
* 返回不用入庫的對象字段數(shù)組
* The full property names that you want to ignore for persistent
*
* @return array
*/
+ (NSArray *)jr_excludePropertyNames;
@end
默認(rèn)NSObject分類實現(xiàn)
@interface NSObject (JRDB) <JRPersistent>
(...methods)
@end
JRDBMgr
@interface JRDBMgr : NSObject
@property (nonatomic, strong) FMDatabase *defaultDB;
+ (instancetype)shareInstance;
+ (FMDatabase *)defaultDB;
- (FMDatabase *)createDBWithPath:(NSString *)path;
- (void)deleteDBWithPath:(NSString *)path;
/**
* 在這里注冊的類,使用本框架的數(shù)據(jù)庫將全部建有這些表
* @param clazz 類名
*/
- (void)registerClazzForUpdateTable:(Class<JRPersistent>)clazz;
- (NSArray<Class> *)registedClazz;
/**
* 更新默認(rèn)數(shù)據(jù)庫的表(或者新建沒有的表)
* 更新的表需要在本類先注冊
*/
- (void)updateDefaultDB;
- (void)updateDB:(FMDatabase *)db;
@end
JRDBMgr持有一個默認(rèn)數(shù)據(jù)庫(~/Documents/jrdb/jrdb.sqlite)婆排,任何不指定數(shù)據(jù)庫的操作声旺,都在此數(shù)據(jù)庫進(jìn)行操作。默認(rèn)數(shù)據(jù)庫可以自行設(shè)置段只。
Method
- (void)registerClazzForUpdateTable:(Class<JRPersistent>)clazz;
在JRDBMgr中注冊的類腮猖,可以使用
-(void)updateDB:(FMDatabase *)db
進(jìn)行統(tǒng)一更新或者創(chuàng)建表。
Table Operation 【表操作】
Create 【建表】
// FMDatabase+JRDB 方法
[[JRDBMgr defaultDB] createTable4Clazz:[Person class]];
[Person jr_createTable];
// 刪除原有的表赞枕,重新創(chuàng)建
[[JRDBMgr defaultDB] truncateTable4Clazz:[Person class]];
[Person jr_truncateTable];
//保存時澈缺,若發(fā)現(xiàn)沒有表,將自動創(chuàng)建
[person jr_save];
Update 【更新表】
[[JRDBMgr defaultDB] updateTable4Clazz:[Person class]];
[Person jr_updateTable];
更新表時鹦赎,只會添加不存在的字段谍椅,不會修改字段屬性,不會刪除字段古话,若有需要雏吭,需要自行寫sql語句進(jìn)行修改
Drop 【刪表】
[[JRDBMgr defaultDB] dropTable4Clazz:[Person class]];
[Person jr_dropTable];
Thread Operation 【線程操作】
- 多線程操作使用FMDB自帶的 FMDatabaseQueue
[person jr_saveWithComplete:^(BOOL success) {
NSLog(@"%d", success);
}];
任何帶complete block的操作,都將放入到FMDatabaseQueue進(jìn)行順序執(zhí)行
- 注:所有需要立刻返回結(jié)果陪踩,或者影響其他操作的數(shù)據(jù)庫操作杖们,都建議放在主線程進(jìn)行更新,大批量更新以及多線程操作數(shù)據(jù)庫時肩狂,請使用帶complete block的操作摘完。
MoreUsage
- 查看FMDatabase+JRDB.h