JRDB:iOS对FMDB的超好用封装

在自己开发中,每次用到数据库都会纠结是使用CoreData还是FMDB。CoreData虽然Api简单,但是调用栈非常复杂,要初始化一个Context需要至少20行代码。。。

显然,对于这种这么恶心的情况,我们的大Github必须有人会跳出来解决这种问题。于是就出现了MagicRecord这个对CoreData的封装库。一开始遇到这个库的时候,好用到几乎让我想把所有项目的数据库都换成CoreData了。两句话解决CoreData调用栈的初始化,一句话完成数据库版本升级和自动数据合并更新(虽然我们很少用到)。

然而这并不能解决一个根本性的问题,CoreData中的每个Object都要和一个context进行绑定,导致我们很多业务需求需要创建自己的私有context,然后再需要更新的时候保存到主context中。这又导致了我们在controller中或者在自己的业务类中维护多一个私有context属性。

所以,最后还是选择了FMDB进行封装。

之前自己搞过Java后台,将FMDB进行Hibernate式的封装,使用runtime解析,不用继承任何基类(swift中要继承NSObject),只要实现一个持久化协议并实现方法即可,屏蔽基本的数据库和表操作。

项目简介:

JRDB:一个对FMDB进行类Hibernate封装的iOS库,支持Objective-C 和 Swift。

Description

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

注:Swift的基本数据类型,不支持Option类型,既不支持Int?Int!等,对象类型支持Option类型

Installation(安装)


1

2

3

use_frameworks!

pod ‘JRDB‘

@import JRDB;

Usage

Save(保存)

  • Objective-C

1

2

3

4

5

6

7

8

9

10

11

12

13

14

Person *p = [[Person alloc] init];

p.a_int = 1;

p.b_unsigned_int = 2;

p.c_long = 3;

p.d_long_long = 4;

p.e_unsigned_long = 5;

p.f_unsigned_long_long = 6;

p.g_float = 7.0;

p.h_double = 8.0;

p.i_string = @"9";

p.j_number = @10;

p.k_data = [NSData data];

p.l_date = [NSDate date];

[p jr_save];

  • Swift

Swift中需要入库的类需要继承NSObject(使用到runtime)

The Object that you want to persistent should inherit from NSObject


1

2

3

4

5

let p = Person()

p.name = "name"

p.age = 10

p.birthday = NSDate()

p.jr_save()

Update(更新)


1

2

3

Person *p = [Person jr_findAll].firstObject;

p.name = @"abc";

[p jr_update columns:nil];

column: 需要更新的字段名,传入空为全量更新

Delete(删除)


1

2

Person *p = [Person jr_findAll].firstObject;

[p jr_delete];

Select查找)

  • 常规查找

1

2

3

Person *p = [Person jr_findByPrimaryKey:@"111"];

NSArray *list = [Person jr_findAll];

NSArray *list1 = [Person jr_findAllOrderBy:@"_age" isDesc:YES];

  • 条件查询

1

2

3

4

5

6

7

8

NSArray *condis = @[

     [JRQueryCondition condition:@"_l_date < ?" args:@[[NSDate date]] type:JRQueryConditionTypeAnd],

     [JRQueryCondition condition:@"_a_int > ?" args:@[@9] type:JRQueryConditionTypeAnd],];

NSArray *arr = [Person jr_findByConditions:condis

                      groupBy:@"_room"

                      orderBy:@"_age"

                      limit:@" limit 0,13 "

                      isDesc:YES];

  • SQL

1

2

NSString *sql = @"select * from Person where age = ?";

NSArray *list = [Person jr_executeSql:sql args:@[@10]];

Other(其他)

协议:JRPersistent


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

@protocol JRPersistent @required

- (void)setID:(NSString * _Nullable)ID;

- (NSString * _Nullable)ID;

@optional

/**

 *  返回不用入库的对象字段数组

 *  The full property names that you want to ignore for persistent

 *  @return array

 */

+ (NSArray * _Nullable)jr_excludePropertyNames;

/**

 *  返回自定义主键字段

 *  @return 字段全名

 */

+ (NSString * _Nullable)jr_customPrimarykey;

/**

 *  返回自定义主键值

 *  @return 主键值

 */

- (id _Nullable)jr_customPrimarykeyValue;

@end

主键

默认每个Object的主键为ID, UUID字符串。

可以实现 jr_customPrimarykey 以及 jr_customPrimarykeyValue 方法,自定义主键。

默认NSObject分类实现


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

@interface NSObject (JRDB) (...methods)

@end

JRDBMgr

@interface JRDBMgr : NSObject

@property (nonatomic, strong) FMDatabase *defaultDB;

+ (instancetype)shareInstance;

+ (FMDatabase *)defaultDB;

- (FMDatabase *)createDBWithPath:(NSString *)path;

- (void)deleteDBWithPath:(NSString *)path;

/**

 *  在这里注册的类,使用本框架的数据库将全部建有这些表

 *  @param clazz 类名

 */

- (void)registerClazzForUpdateTable:(Class)clazz;

- (NSArray *)registedClazz;

/**

 * 更新默认数据库的表(或者新建没有的表)

 * 更新的表需要在本类先注册

 */

- (void)updateDefaultDB;

- (void)updateDB:(FMDatabase *)db;

@end

JRDBMgr持有一个默认数据库(~/Documents/jrdb/jrdb.sqlite),任何不指定数据库的操作,都在此数据库进行操作。默认数据库可以自行设置。

Method


1

- (void)registerClazzForUpdateTable:(Class)clazz;

在JRDBMgr中注册的类,可以使用


1

-(void)updateDB:(FMDatabase *)db

进行统一更新或者创建表。

Table Operation(表操作)

Create(建表)


1

2

3

4

5

6

7

8

9

10

11

// FMDatabase+JRDB 方法

[[JRDBMgr defaultDB] createTable4Clazz:[Person class]];

[Person jr_createTable];

// 删除原有的表,重新创建

[[JRDBMgr defaultDB] truncateTable4Clazz:[Person class]];

[Person jr_truncateTable];

//保存时,若发现没有表,将自动创建

[person jr_save];

Update 【更新表】

[[JRDBMgr defaultDB] updateTable4Clazz:[Person class]];

[Person jr_updateTable];

更新表时,只会添加不存在的字段,不会修改字段属性,不会删除字段,若有需要,需要自行写sql语句进行修改

Drop(删表)


1

2

[[JRDBMgr defaultDB] dropTable4Clazz:[Person class]];

[Person jr_dropTable];

Thread Operation(线程操作)

多线程操作使用FMDB自带的 FMDatabaseQueue


1

2

3

[person jr_saveWithComplete:^(BOOL success) {

    NSLog(@"%d", success);

}];

任何带complete block的操作,都将放入到FMDatabaseQueue进行顺序执行

注:所有需要立刻返回结果,或者影响其他操作的数据库操作,都建议放在主线程进行更新,大批量更新以及多线程操作数据库时,请使用带complete block的操作。

MoreUsage

时间: 2024-11-05 19:41:44

JRDB:iOS对FMDB的超好用封装的相关文章

ios开发FMDB导入SQLCipher加密数据库

转:http://www.2cto.com/kf/201407/315727.html [iOS]FMDB/SQLCipher数据库加解密,迁移

iOS 使用FMDB进行数据库操作

[摘要]本文介绍iOS 使用FMDB进行数据库操作,并提供详细的示例代码供参考. 1.首先要先导入第三方类库FMdatabase. 2.获得存放数据库文件的沙盒地址. View Row Code 1 +(NSString *)databaseFilePath 2 { 3   4 NSArray *filePath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 5 NSStrin

IOS数据库FMDB增、删、改、查的使用【原创】

http://blog.it985.com/13588.html IOS数据库FMDB增.删.改.查的使用[原创] FMDB是一个XCODE的中一个轻量级的数据库,用于将网络资源存储在本地.所以,FMDB是一个很实用,很关键的知识点.在这里写了个简单的例子,基于FMDB的添删改查操作,代码可能比较乱,希望不要伤了各位的眼睛.其中添加删除更改的操作都非常简单,不需要做太多操作,只需要用到FMDB封装好的executeUpdate方法就行了. 第一步.加入sqlite3的包文件 如图所示,依次选择并

iOS 使用FMDB事务批量更新数据库

当谈到“事务”时,我想到了sqlite本身是支持事务操作的,FMDB作为sqlite的上层封装也对事务进行了支持,那么说了这么多给不了解“事务”这个词的同学解释一下吧:通常一次 sqlite3_exec 就是一次事务,假如你要对数据库中的Stutent表插入新数据,那么该事务的具体过程是:开始新事物->插入数据->提交事务,那么当我们要往该表内插入500条数据,如果按常规操作处理就要执行500次“开始新事物->插入数据->提交事务”的过程. 好吧,今天的重点来了,举个例子:假如北京

iOS开发之微信聊天工具栏的封装(走过路过不要错过哦)

之前山寨了一个新浪微博(iOS开发之山寨版新浪微博小结),这几天就山寨个微信吧.之前已经把微信的视图结构简单的拖了一下(IOS开发之微信山寨版),今天就开始给微信加上具体的实现功能,那么就先从微信的聊天界面开始吧.提到封装是少不了写代码的,在封装组件的时候,为了组件的可移植性,我们就不能用storyboard来拖拽了.为了屏幕的适配,适应不同屏幕的手机,所以在封装组件的时候是少不了为我们的组件来添加约束.今天博客中的所有代码都是脱离storyboard的,这些代码在别的工程中也是可以使用的.好,

iOS开发UI篇—核心动画(UIView封装动画)(转摘)

iOS开发UI篇—核心动画(UIView封装动画) 一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画支持 执行动画所需要的工作由UIView类自动完成,但仍要在希望执行动画时通知视图,为此需要将改变属性的代码放在[UIViewbeginAnimations:nil context:nil]和[UIView commitAnimations]之间 常见方法解析: + (void)setAnimati

iOS中 FMDB第三方SQLite数据库 UI_20

1.什么是FMDB? FMDB是iOS平台下SQLite数据库,只不过它是OC方式封装了C语言的SQLite语句,使用起来更加面向对象 2.FMDB的优点:1.使用起来更加面向对象; 2.对比苹果自带的 Core Data 数据管理工具更加的轻量级,更加的灵活,而且FMDB支持跨平台; 3.提供多线程下的数据安全保护机制,有效地防止数据混乱 3.FMDM中重要的类: FMDBDataBase: 它代表一个数据库对象,(我们需要创建数据库对象时就使用这个类) FMDBDataBaseQueue:

iOS中FMDB的使用

需要用到离线缓存将数据信息存入数据库,在没有网络的时候进行加载,而iOS用的就是sqlite3数据库,用原生的sql我们也能实现,但是书写起来比较麻烦,尤其是其它语言转过来的程序员会感觉吃力,我们一般使用第三方FMDB 2 FMDB的下载地址 https://github.com/ccgus/fmdb 3在FMDB下载文件后,工程中必须导入如下文件,并使用 libsqlite3.dylib 依赖包 4 FMDB常用类 FMDatabase : 一个单一的SQLite数据库,用于执行SQL语句.

iOS 使用FMDB SQLCipher给数据库加密

关于SQLite,SQLCipher和FMDB SQLite是一个轻量的.跨平台的.开源的数据库引擎,它的在读写效率.消耗总量.延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如iOS.Android).然而免费版的SQLite有一个致命缺点:不支持加密.这就导致存储在SQLite中的数据可以被任何人用任何文本编辑器查看到. 如果我们想要使得自己的数据库加密,解决方案就是使用另一款开源的加密数据库SQLCipher,SQLCipher使用256-bit AES加密,由于