JRDB sqlite 使用详解

来源:互联网 发布:淘宝情趣珠内衣买家秀 编辑:程序博客网 时间:2024/06/05 03:26

最近需要使用到数据库 发现了 JRDB 研究了下 做个小笔记 以备自己以后使用

JRDB
使用分类的模式,模仿Hibernate,对FMDB进行简易封装
支持pod 安装 『pod ‘JRDB’』,Podfile需要添加 use_framework!
使用协议,不用继承基类,对任意NSObject可以进行入库操作
支持swift 和 Objective-C
支持数据类型:基本数据类型(int,double,等),String,NSData,NSNumber,NSDate
注:swift的基本数据类型,不支持Option类型,既不支持Int?Int!等,对象类型支持Option类型
Installation 【安装】

pod ‘JRDB’

1基本的应用 请参考 https://github.com/scubers/JRDB

2 刚开始使用的时候 第一个问题就来了 就是一个model 不能多次保存到表里 这个让我找了很久 后来去问了前辈 知道了怎么设置

 Person *p = [self createPerson:1 name:nil];    for (int i = 0; i < 10; i++) {        [p.money addObject:[self createMoney:i]];    }    for (NSInteger i=0; i < 10; i++ ) {        [p jr_saveWithComplete:^(BOOL success) {        //这一步很重要 设置关联的ID为nil 就可以保存            [p  setID:nil];         }];    }

3 主要的实现方法都在 NSObject+JRDB.h文件

////  NSObject+JRDB.h//  JRDB////  Created by JMacMini on 16/5/10.//  Copyright © 2016年 Jrwong. All rights reserved.//#import <Foundation/Foundation.h>#import "JRPersistent.h"#import "JRQueryCondition.h"#define JR_DEFAULTDB [JRDBMgr defaultDB]@class FMDatabase;@interface NSObject (JRDB) <JRPersistent>/** *  注册的时候自动调用, 每个注册类有且只执行一次; */+ (void)jr_configure;#pragma mark - convinence method- (void)jr_setSingleLinkID:(NSString * _Nullable)ID forKey:(NSString * _Nonnull)key;- (NSString * _Nullable)jr_singleLinkIDforKey:(NSString * _Nonnull)key;- (void)jr_setParentLinkID:(NSString * _Nullable)ID forKey:(NSString * _Nonnull)key;- (NSString * _Nullable)jr_parentLinkIDforKey:(NSString * _Nonnull)key;- (NSMutableDictionary<NSString *,JRDBDidFinishBlock> * _Nonnull)jr_finishBlocks;#pragma mark - save or update- (BOOL)jr_saveOrUpdateOnlyToDB:(FMDatabase * _Nonnull)db;/** *  保存或更新自身到db, 并进行关联保存删除更新 *    *  @param db *  @param useTransaction 若外层有事务,请用NO,若没有,请用YES   *  @complete   完成block */- (BOOL)jr_saveOrUpdateUseTransaction:(BOOL)useTransaction toDB:(FMDatabase * _Nonnull)db;- (void)jr_saveOrUpdateUseTransaction:(BOOL)useTransaction complete:(JRDBComplete _Nullable)complete  toDB:(FMDatabase * _Nonnull)db;- (BOOL)jr_saveOrUpdateToDB:(FMDatabase * _Nonnull)db;- (void)jr_saveOrUpdateWithComplete:(JRDBComplete _Nullable)complete toDB:(FMDatabase * _Nonnull)db;#pragma mark - save or update use DefaultDB   //保存或更新 默认数据库- (BOOL)jr_saveOrUpdateUseTransaction:(BOOL)useTransaction;- (void)jr_saveOrUpdateUseTransaction:(BOOL)useTransaction complete:(JRDBComplete _Nullable)complete;- (BOOL)jr_saveOrUpdate;- (void)jr_saveOrUpdateWithComplete:(JRDBComplete _Nullable)complete;#pragma mark - save/** *  仅保存自身,不进行关联保存(不建议使用) * *  @param db */- (BOOL)jr_saveOnlyToDB:(FMDatabase * _Nonnull)db;/** *  保存自身到db, 并进行关联保存删除更新 * *  @param db *  @param useTransaction 若外层有事务,请用NO,若没有,请用YES */- (BOOL)jr_saveUseTransaction:(BOOL)useTransaction toDB:(FMDatabase * _Nonnull)db;- (void)jr_saveUseTransaction:(BOOL)useTransaction complete:(JRDBComplete _Nullable)complete  toDB:(FMDatabase * _Nonnull)db;- (BOOL)jr_saveToDB:(FMDatabase * _Nonnull)db;- (void)jr_saveWithComplete:(JRDBComplete _Nullable)complete toDB:(FMDatabase * _Nonnull)db;#pragma mark - save use DefaultDB/** *  仅保存自身,不进行关联保存(不建议使用):使用默认数据库 */- (BOOL)jr_saveOnly;/** *  保存自身到db, 并进行关联保存删除更新 :使用默认数据库 * *  @param useTransaction 若外层有事务,请用NO,若没有,请用YES */- (BOOL)jr_saveUseTransaction:(BOOL)useTransaction;- (void)jr_saveUseTransaction:(BOOL)useTransaction complete:(JRDBComplete _Nullable)complete;- (BOOL)jr_save;- (void)jr_saveWithComplete:(JRDBComplete _Nullable)complete;#pragma mark - update/** *  仅更新自身,不进行关联保存(不建议使用) * *  @param db *  @param columns 要更新的字段 */- (BOOL)jr_updateOnlyColumns:(NSArray<NSString *> * _Nullable)columns toDB:(FMDatabase * _Nonnull)db;/** *  更新自身到db, 并进行关联保存删除更新 * *  @param db *  @param columns 要更新的字段 *  @param useTransaction 若外层有事务,请用NO,若没有,请用YES */- (BOOL)jr_updateColumns:(NSArray<NSString *> * _Nullable)columns          useTransaction:(BOOL)useTransaction                    toDB:(FMDatabase * _Nonnull)db;- (void)jr_updateColumns:(NSArray<NSString *> * _Nullable)columns          useTransaction:(BOOL)useTransaction                complete:(JRDBComplete _Nullable)complete                    toDB:(FMDatabase * _Nonnull)db;- (BOOL)jr_updateColumns:(NSArray<NSString *> * _Nullable)columns                    toDB:(FMDatabase * _Nonnull)db;- (void)jr_updateColumns:(NSArray<NSString *> * _Nullable)columns                complete:(JRDBComplete _Nullable)complete                    toDB:(FMDatabase * _Nonnull)db;#pragma mark - update use DefaultDB/** *  仅更新自身,不进行关联保存(不建议使用) * *  @param columns 要更新的字段 */- (BOOL)jr_updateOnlyColumns:(NSArray<NSString *> * _Nullable)columns;/** *  更新自身到db, 并进行关联保存删除更新 * *  @param columns 要更新的字段 *  @param useTransaction 若外层有事务,请用NO,若没有,请用YES *  @complete  完成block */- (BOOL)jr_updateColumns:(NSArray<NSString *> * _Nullable)columns useTransaction:(BOOL)useTransaction;- (void)jr_updateColumns:(NSArray<NSString *> * _Nullable)columns useTransaction:(BOOL)useTransaction complete:(JRDBComplete _Nullable)complete;- (BOOL)jr_updateColumns:(NSArray<NSString *> * _Nullable)columns;- (void)jr_updateColumns:(NSArray<NSString *> * _Nullable)columns complete:(JRDBComplete _Nullable)complete;#pragma mark - delete+ (BOOL)jr_deleteAllOnlyFromDB:(FMDatabase * _Nonnull)db;/** *  仅删除自身,不进行关联保存(不建议使用) * *  @param db */- (BOOL)jr_deleteOnlyFromDB:(FMDatabase * _Nonnull)db;/** *  删除自身, 并进行关联保存删除更新 * *  @param db *  @param useTransaction 若外层有事务,请用NO,若没有,请用YES */- (BOOL)jr_deleteUseTransaction:(BOOL)useTransaction fromDB:(FMDatabase * _Nonnull)db;- (void)jr_deleteUseTransaction:(BOOL)useTransaction complete:(JRDBComplete _Nullable)complete fromDB:(FMDatabase * _Nonnull)db;- (BOOL)jr_deleteFromDB:(FMDatabase * _Nonnull)db;- (void)jr_deleteWithComplete:(JRDBComplete _Nullable)complete fromDB:(FMDatabase * _Nonnull)db;#pragma mark - delete use DefaultDB+ (BOOL)jr_deleteAllOnly;/** *  仅删除自身,不进行关联保存(不建议使用) */- (BOOL)jr_deleteOnly;/** *  删除自身, 并进行关联保存删除更新 * *  @param useTransaction 若外层有事务,请用NO,若没有,请用YES */- (BOOL)jr_deleteUseTransaction:(BOOL)useTransaction;- (void)jr_deleteUseTransaction:(BOOL)useTransaction complete:(JRDBComplete _Nullable)complete;- (BOOL)jr_delete;- (void)jr_deleteWithComplete:(JRDBComplete _Nullable)complete;#pragma mark - select/** *  根据ID查找 * *  @param ID */+ (instancetype _Nullable)jr_findByID:(NSString * _Nonnull)ID;+ (instancetype _Nullable)jr_findByID:(NSString * _Nonnull)ID fromDB:(FMDatabase * _Nonnull)db;/** *  根据主键查找 *  @param primaryKey  主键 */+ (instancetype _Nullable)jr_findByPrimaryKey:(id _Nonnull)primaryKey;+ (instancetype _Nullable)jr_findByPrimaryKey:(id _Nonnull)primaryKey fromDB:(FMDatabase * _Nonnull)db;/** *  @OrderBy 顺序 订单 *  @isDesc  描述 * */+ (NSArray<id<JRPersistent>> * _Nonnull)jr_findAll;+ (NSArray<id<JRPersistent>> * _Nonnull)jr_findAllFromDB:(FMDatabase * _Nonnull)db;+ (NSArray<id<JRPersistent>> * _Nonnull)jr_findAllOrderBy:(NSString * _Nullable)orderBy isDesc:(BOOL)isDesc;  //降序返回+ (NSArray<id<JRPersistent>> * _Nonnull)jr_findAllFromDB:(FMDatabase * _Nonnull)db orderBy:(NSString * _Nullable)orderBy isDesc:(BOOL)isDesc;/** *  @param conditions 查找条件 *  @param groupBy    组 *  @param orderBy    顺序 *  @param limit      限制 *  @param isDesc     描述 *  @param db */+ (NSArray<id<JRPersistent>> * _Nonnull)jr_findByConditions:(NSArray<JRQueryCondition *> * _Nullable)conditions groupBy:(NSString * _Nullable)groupBy orderBy:(NSString * _Nullable)orderBy limit:(NSString * _Nullable)limit isDesc:(BOOL)isDesc fromDB:(FMDatabase * _Nullable)db;+ (NSArray<id<JRPersistent>> * _Nonnull)jr_findByConditions:(NSArray<JRQueryCondition *> * _Nullable)conditions groupBy:(NSString * _Nullable)groupBy orderBy:(NSString * _Nullable)orderBy limit:(NSString * _Nullable)limit isDesc:(BOOL)isDesc;#pragma mark - table message /** *  数据库中的当前列  获取表格字段 * *  @param db * */+ (NSArray<NSString *> * _Nonnull)jr_currentColumnsInDB:(FMDatabase * _Nonnull)db;+ (NSArray<NSString *> * _Nonnull)jr_currentColumns;//=============================重点==================================#pragma mark - sql语句/** *  因为直接返回对象,所以sql 请以 select * 开头 * *  @param sql  sql: select * from Person where _ID = ? *  @param args 参数 @[@"111"] * *  @return 返回数组 */+ (NSArray<id<JRPersistent>> * _Nonnull)jr_executeSql:(NSString * _Nonnull)sql args:(NSArray * _Nullable)args;+ (NSArray<id<JRPersistent>> * _Nonnull)jr_executeSql:(NSString * _Nonnull)sql args:(NSArray * _Nullable)args fromDB:(FMDatabase * _Nonnull)db;/** *  返回条数 * *  @param sql  select count(1) where age > ? *  @param args @[@10] * *  @return 数据条数 */+ (NSUInteger)jr_countForSql:(NSString * _Nonnull)sql args:(NSArray * _Nullable)args;+ (NSUInteger)jr_countForSql:(NSString * _Nonnull)sql args:(NSArray * _Nullable)args fromDB:(FMDatabase * _Nonnull)db;+ (BOOL)jr_executeUpdate:(NSString * _Nonnull)sql args:(NSArray * _Nullable)args;+ (BOOL)jr_executeUpdate:(NSString * _Nonnull)sql args:(NSArray * _Nullable)args fromDB:(FMDatabase * _Nonnull)db;#pragma mark - table operation+ (BOOL)jr_createTable;+ (BOOL)jr_createTableInDB:(FMDatabase * _Nonnull)db;+ (BOOL)jr_updateTable;+ (BOOL)jr_updateTableInDB:(FMDatabase * _Nonnull)db;+ (BOOL)jr_dropTable;+ (BOOL)jr_dropTableInDB:(FMDatabase * _Nonnull)db;+ (BOOL)jr_truncateTable;+ (BOOL)jr_truncateTableInDB:(FMDatabase * _Nonnull)db;#pragma mark - hooking+ (void)jr_swizzleSetters4Clazz;- (NSMutableArray * _Nullable)jr_changedArray;@end

4 后面是实践的一些小模块

常用的两个保存方式

    [p1 jr_saveWithComplete:^(BOOL success) {        [p jr_save];//保存成功再调用    }];

常用的查找方式

Person *p = [Person jr_findAll].firstObject;//主键查找Person *p = [Person jr_findByPrimaryKey:@"111"];NSArray *list = [Person jr_findAll];// 根据字段 排序 获取数据   获取的数据为降序排布    NSArray *list1 = [Person jr_findAllOrderBy:@"_a_int" isDesc:YES]; // sql 语句查询   这里 age 为你需要设置的条件的值 ?占位符    NSString *sql = @"select * from Person where _a_int > ?";    NSArray *list = [Person jr_executeSql:sql args:@[@4]];
// 获取表格字段  全部信息   NSArray * currentarray = [Person jr_currentColumns];

常用的跟新的方法

1Person *p = [Person jr_findAll].firstObject;p.name = @"我跟新了name";[p jr_updateColumns:nil];2//  需要更新的字段  只更新表里_name 字段    for (Person * tmp in array) {        i++;        if (tmp.name.length >0) {            tmp.name = [NSString stringWithFormat:@"我勒个去啊name%ld",i];            tmp.i_string = [NSString stringWithFormat:@"我勒个去i_string%ld",i];            [tmp jr_updateColumns:@[@"_name"] toDB:db];        }    }
//更新表里_a_int  _i_string 字段 注意需要加上_int i =0;    NSArray * array = [Person jr_findAll];    for (Person * tmp  in  array) {        i++;        tmp.name = @"iOS";        tmp.i_string = @"我爱你";        tmp.a_int = i;    }    NSLog(@"%@", array);    [array jr_updateColumns:@[@"_a_int",@"_i_string"] complete:^(BOOL success) {        NSLog(@"真的执行正确了加油 加油");    } toDB:db];

常用的表格删除方法

 [Person jr_dropTable]; [HelpListModel jr_dropTable]; [Money jr_dropTable]; [Card jr_dropTable]; [JRFMDBBookModel jr_dropTable]; [Modeltest jr_dropTable];

写的有点乱 后续整理后 再更新 。。。。。。。

0 0