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
- JRDB sqlite 使用详解
- android SQLite使用详解
- android sqlite使用详解
- Android SQLite使用详解
- SQLite的使用详解
- SQLite数据库使用详解
- Sqlite的使用详解
- Python SQLite使用详解
- C#使用SQLite数据库详解
- C#使用SQLite数据库详解
- C#使用SQLite数据库详解
- Android 使用SQLite数据库详解
- android sqlite 数据库使用 详解
- andorid SQLite 的使用详解
- iOS之SQLite使用详解
- iOS之SQLite使用详解
- iOS之SQLite使用详解
- iphone开发之SQLite使用详解
- 重新整理
- 338. Counting Bits
- 2016 Multi-University Training Contest 1
- LeetCode - 200. Number of Islands
- 关于myeclipse实现文件上传与使用的路径问题
- JRDB sqlite 使用详解
- C#值类型和引用类型的深入理解
- 基于粒子群算法的最小二乘支持向量机实现多分类(PSO_LSSVM)
- php SPL学习笔记
- 观察者模式I
- jqueryuploadify的canceled请求引发SocketException: Software caused connection abort: socket write error
- android studio jni.h 红色报错
- 人生第一场SRM SRM695 Div.2
- MFC显示图片