最近需要使用到数据库 发现了 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];
常用的跟新的方法
1
Person *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];
写的有点乱 后续整理后 再更新 。。。。。。。