JRDB sqlite 使用详解

最近需要使用到数据库 发现了 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];

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值