IHFDB是基于FMDB上的一層封裝束析,通過直接函數(shù)調(diào)用而不用關(guān)心sql代碼的實(shí)現(xiàn)。
GitHub上下載地址:https://github.com/cjsykx/IHFDB.git
關(guān)鍵說明:
1.通過NSObject+IHFDB.h 中的方法對數(shù)據(jù)進(jìn)行CURL操作袄琳,將數(shù)據(jù)存入sqlite數(shù)據(jù)庫中。并且可以根據(jù)自定義主鍵防止重復(fù)插入亡脸,使用deleteDirtyDataWithPredicate對網(wǎng)絡(luò)中的臟數(shù)據(jù)進(jìn)行刪除怔软。
注意:在方法中都有預(yù)留IHFDBCompleteBlock(回調(diào)),tableName(操作的表),db(哪個(gè)庫),基本上都不用設(shè)置如蚜,用最簡單的方法就可以
2.通過NSObject+IHFModelOperation.h對模型和字典進(jìn)行互轉(zhuǎn)操作压恒。
3.IHFDBObjectDataSource.h可以設(shè)置
3.1.自定義主鍵 customPrimarykey(用來防止重復(fù)插入和根據(jù)主鍵查找)
3.2.映射關(guān)系 propertyNameDictForMapper(字典轉(zhuǎn)模型和數(shù)據(jù)庫操作都生效)
3.3.屏蔽字段 propertyNamesForIgnore(字典轉(zhuǎn)模型和數(shù)據(jù)庫操作都生效)
3.4.設(shè)置子項(xiàng)的類 relationshipDictForClassInArray(字典轉(zhuǎn)模型和數(shù)據(jù)庫操作都生效)
數(shù)據(jù)庫中的CURL
使用方法:以模型Patient為例:
用戶主要是調(diào)用NSObject+IHFDB.h中的方法,例如
創(chuàng)建表
//為Patient創(chuàng)建一張表名為Patient的表
[Patient createTable] ;
當(dāng)然也可以使用Block回調(diào)错邦,下面的增刪改查的回調(diào)跟這個(gè)類似
[Patient createTableDidCompleteBlock:^(BOOL success) { // 創(chuàng)建成功后的回調(diào); }]
如果想為Patient的關(guān)系類如例子中的Drugs建表探赫,需要在Patient.m中聲明。(不需要再調(diào)用[Drug createTable]來為子類建表)
+ (NSDictionary *)relationshipDictForClassInArray {
return @{ @"drugs" : [Drug class],};
}
如果你不要創(chuàng)建跟類名一樣的比如Patient,你可以通過傳入Table name
+(BOOL)createTableWithName:(NSString *)tableName inDataBase:(FMDatabase *)db CompleteBlock:(IHFDBCompleteBlock)completion;
table name 為你想要的名稱撬呢, 建議不要修改伦吠,修改后增刪改查都要調(diào)用類似這樣的方法(增刪改查都提供)
db 默認(rèn)是空的 , 但是你可以在如下
[_queue inDatabase:^(FMDatabase *db) { // 在已經(jīng)開始的操作下調(diào)用 }];
增刪改查與此同理#####
插入
[Patient save]; //執(zhí)行插入
建議在病人多的情況下魂拦,調(diào)用如下
[Patient saveModelArray:PatientArray completeBlock:^(BOOL success) {
NSLog(@"因?yàn)檫@是使用事務(wù),增加插入速度");
}];
如果要插入子項(xiàng)毛仪,也就是
+ (NSDictionary *)relationshipDictForClassInArray { return @{
@"drugs" : [Drug class],};
}
查詢
同上,有block的回調(diào)芯勘,db和tableName
跟Core Data 一樣使用 predicate 箱靴,但是predicate 是自定義的IHFPredicate. 使用如下:
IHFPredicate *predicate = [[IHFPredicate alloc] initWithFormat:@"name = %@",@"張飛"];
[patient updateWithPredicate:predicate completeBlock:^(BOOL success) { }];
1.可以找這個(gè)Patient表中的所有數(shù)據(jù),你可以
[Patient selectAll];
2.可以查找數(shù)量
+ (NSInteger)selectCountWithPredicate:(IHFPredicate *)predicate;
3.可以根據(jù)主鍵來找
+ (NSArray *)selectWithCostomPrimaryKeyValue:(id)value ;
但是你要設(shè)置主鍵
+ (NSString *)customPrimarykey{
return @"patientID";
}
我們會將你要找的類和關(guān)聯(lián)的類全部轉(zhuǎn)成對象荷愕。
刪除
// 刪除與上述的都類似
唯一注意的 cascade :級聯(lián)
+(void)deleteWithPredicate:(IHFPredicate *)predicate isCascade:(BOOL)cascade completeBlock:(IHFDBCompleteBlock)completion
{
// cascade 來設(shè)置級聯(lián)
}
默認(rèn)cascade yes . 也就是級聯(lián)衡怀, 就是說當(dāng)你刪除了這個(gè)類后,會將他所關(guān)聯(lián)的類都進(jìn)行刪除安疗。當(dāng)然你也可以設(shè)置成只刪除這個(gè)類抛杨,不影響他的關(guān)聯(lián)的類。
更新
跟上述的類似荐类,也有級聯(lián)關(guān)系
-(void)updateWithPredicate:(IHFPredicate *)predicate isCascade:(BOOL)cascade completeBlock:(IHFDBCompleteBlock)completion;
級聯(lián)默認(rèn)是yes 蝶桶,也就是會讓Patient病人下的所以關(guān)系表更加Patient的值重新更新一次,如果是Not掉冶,就算Patient下有Bed模型真竖,也只會更新Patient的屬性脐雪,關(guān)系表不做更新。
可以直接 deleteDirtyDataWithPredicate 恢共,用Predicate對你網(wǎng)絡(luò)請求的區(qū)間對臟數(shù)據(jù)進(jìn)行刪除和更新战秋!就不要需要自己去刪除和更新
模型與字典的轉(zhuǎn)換
把模型轉(zhuǎn)成字典
- (NSDictionary *)dictionaryFromModel;
把模型數(shù)組轉(zhuǎn)成字典數(shù)組 (類方法和實(shí)例方法)
- (NSArray <NSDictionary *> *)dictionaryArrayFromModelArray;
+ (NSArray <NSDictionary *> *)dictionaryArrayFromModelArray:(NSArray *)modelArray;
把字典轉(zhuǎn)成模型
+ (instancetype)modelFromDictionary:(NSDictionary *)dict;
把模型轉(zhuǎn)成字典
+ (NSArray <id> *)modelArrayFromDictionaryArray:(NSArray <NSDictionary *> *)dict;
可以設(shè)置字典映射,和設(shè)置子項(xiàng)的類等信息
有問題可以盡管issues , 也可以投到我的163郵箱 cjsykx@163.com.