FMDB的封装,极大简化你的数据库操作,对于自己的扩展也非常简单
封装类的数据库操作思路与多数FMDB封装不同,是直接实体类对象来做增、删、改、查。
代码中有比较详细的注释和讲解,有助于理解runtime的机制,如果能帮到你,麻烦给一个star
。
对原作者的框架反射部分做了简化,便于理解,原作者的源码github地址在本文尾部。
原项目使用的是sqlitepersistentobjects,多线程处理时,问题比较多
多数FMDB框架功能比较多,代码量也比较大,但是很多功能不常用,而且也不便于理解,因此我考虑用简单易于理解的方式
来封装一个适用于公司项目的轻量级小框架。
因为项目需要在多线程下操作数据库,所以demo中的使用案例多数是多线程操作,但是单线程操作也适用。
改进后的特点如下:
1.自动创建数据库、自动创建数据库表。
2.自动检测字段添加新字段。
3.一行代码实现数据库的CURD操作。
4.源码及其简单,易于理解和掌握。
5.扩展自己的功能也非常得简单,容易。
6.支持多线程,非线程阻塞。
7.支持arc和mrc。
使用JKDBModel非常的简单,只需要将FMDB和DBModel拖入项目中,然后添加libsqlite3.dylib
然后让你的实体类继承自JKDBModel,你的实体类就具备了操作数据库的功能。
操作都有保存和批量保存两种方式。
例如
保存操作:[user save]
批量保存:[User saveObjects:array]
/** 数据库中是否存在表 */
+ (BOOL)isExistInTable;
/** 保存或更新
* 如果不存在主键,保存,
* 有主键,则更新
*/
- (BOOL)saveOrUpdate;
/** 保存单个数据 */
- (BOOL)save;
/** 批量保存数据 */
+ (BOOL)saveObjects:(NSArray *)array;
/** 更新单个数据 */
- (BOOL)update;
/** 批量更新数据*/
+ (BOOL)updateObjects:(NSArray *)array;
/** 删除单个数据 */
- (BOOL)deleteObject;
/** 批量删除数据 */
+ (BOOL)deleteObjects:(NSArray *)array;
/** 通过条件删除数据 */
+ (BOOL)deleteObjectsByCriteria:(NSString *)criteria;
/** 清空表 */
+ (BOOL)clearTable;
/** 查询全部数据 */
+ (NSArray *)findAll;
/** 通过主键查询 */
+ (instancetype)findByPK:(int)inPk;
/** 查找某条数据 */
+ (instancetype)findFirstByCriteria:(NSString *)criteria;
/** 通过条件查找数据
* 这样可以进行分页查询 @" WHERE pk > 5 limit 10"
*/
+ (NSArray *)findByCriteria:(NSString *)criteria;
/**
* 创建表
* 如果已经创建,返回YES
*/
+ (BOOL)createTable;
#pragma mark - must be override method
/** 如果子类中有一些property不需要创建数据库字段,那么这个方法必须在子类中重写
*/
+ (NSArray *)transients;
修改了创建表和字段检测功能方法。
由于实际项目中,一个账号对应一个文件夹放数据库,经常会有切换账号登录的需求,在initialize创建数据库表,只执行一次,数据库不能保证一定创建,因此添加切换数据库功能,动态创建功能。 2015-08-25
添加条件查询和删除的新方法:
+ (instancetype)findFirstWithFormat:(NSString *)format, ...;
+ (NSArray *)findWithFormat:(NSString *)format, ...;
/** 通过条件删除 (多参数)--2 */
+ (BOOL)deleteObjectsWithFormat:(NSString *)format, ...;
更新于2015-09-08
SQLite 默认支持五种数据类型TEXT、INTEGER、REAL、BLOB、NULL,我只做了少数类型的判断,
如:int、unsigned int、short、unsigned short、BOOL,对象类型默认是字符串。
当然你可以详细的把所有的类型判断都做出来,代码中有部分常用的表示符号,详细的可以查看apple 文档。
理解代码比会使用代码更重要,望使用的时候先理解一下实现思路。
动态获取Model的属性部分源自:https://github.com/li6185377/LKDaoBase
增删改查封装思想源自:SQLitePersistentObject
,与之前做Java时的数据库操作类似,更简易。
如果你有什么问题或者有更好的建议,请告知我,我会及时更正,修改。