TODBModel
==============
TODBModel是基于FMDB开发的数据库模型系统,它将数据库操作完全整合到模型中。该类的任何子类将自动创建并维护数据库,无需掌握任何SQL语法及概念即可执行数据库操作。支持字符串、整型、浮点型、NSData、NSDate、UIImage、NSArray和NSDictionary的存储。
模型缓存加数据库异步读写,创建1000条数据仅需0.02秒。
关于对“事物”的支持问题,我考虑了很久,最终还是放弃了。技术上可以实现,但TODBModel并不是数据库的扩展,而是一种数据存储方案,旨在为那些希望简单存储数据的场景提供支持。我会最大限度地简化操作流程,让用户感觉在操作面向对象的model,而不是更抽象的数据表。
在使用TODBModel时,大多数情况下用户都在操作内存模型。模型的增删改操作也是同步操作内存模型,而数据库操作在模型操作完成后异步完成(将操作动作转换为SQL语句,等待队列执行),因此用户无需担心因为多线程操作导致的数据错误或执行顺序与预期不符的情况。
快速集成
推荐使用cocoapod安装
pod 'TODBModel'
如何使用
1、创建一个对象,继承TODBModel。
2、为对象添加属性
// AddressModel.h
#import "TODBModel.h"
@interface AddressModel : NSObject
@property (nonatomic,strong) NSString *name;
@property (nonatomic,assign) int addressID;
@property (nonatomic,strong) NSDate *editDate;
@property (nonatomic,strong) NSString *mobile;
@property (nonatomic,strong) NSString *address;
@end
3、覆盖 +(NSString *)db_pk方法,并返回主键对应的属性。
// AddressModel.m
#import "AddressModel.h"
@implementation AddressModel
+ (void)initialize{
//在数据库中注册数据表
[self regiestDB];
}
+ (NSString *)db_pk{
return @"addressID";
}
@end
4、增删改
//创建
AddressModel *model = [AddressModel crateModel];
//保存
[model save:^(TODBModel *model) {
//保存成功
}]
//删除
[model del:^(TODBModel *model) {
//删除成功
}]
5、查询
//查询全部
[AddressModel allModels:^(NSArray<TODBModel *> *models) {
//获取成功
}];
//搜索name中或者mobile中包含“123”的数据
TODBCondition *condition1 = [TODBCondition condition:@"name" like:@"%123%"];
TODBCondition *condition2 = [TODBCondition condition:@"mobile" like:@"%123%"];
[AddressModel search:[TODBOrCondition conditionWith:condition1 or:condition2] callBack:^(NSArray<TODBModel *> *models) {
//搜索完成
}];
Swift
在Swift中,对于非指针对象(如Int、Float、Double、Boolean等),请勿使用“?”、“!”修饰属性。否则可能导致该字段无法插入数据库。
// AddressModel.swift
import UIKit
import TODBModel
class AddressModel: TODBModel {
var name: String = "";
var addressID: Int = 0;
var age: Float = 0;
var editDate: NSDate!;
var mobile: String!;
var address: String!;
public static override func db_pk() -> String{
return "addressID";
}
}
特别说明
TODBModel基于内存唯一原则设计,因此请勿使用alloc方式创建对象,而应该使用以下方法创建
-modelByKey:
-modelByKey: allowNull:
-createModel
-createModels:
多次调用-modelByKey:来获取同一key对应的对象时,将获得指向同一内存地址的指针实例。
更新日志
版本 1.2.2
0、当模型属性中包含未创建数据表的自定义对象时,直接把对象序列化存储为BLOB列中。该对象会检测是否支持NSCoding协议,如果未支持则会自动实现协议。
1、修复了一个FMDB中的一个bug——释放FMResultSet对象时使用的线程与查询时不同,导致插入操作如果过于频繁可能导致崩溃。
版本 1.2.1
0、修复了一个模型嵌套时无法保存的问题。
版本 1.2.0
0、当N个模型分别update时,现在会自动合并sql处理,大幅提高了写入速度。
1、分离了数据表读取和生成模型的线程,提高了并发处理时的读取速度。
2、对模型属性进行缓存,现在每1万条记录读取速度小于1秒(iphone6测试0.83秒)
版本 1.0.0
0、移除了TODBModel类,现在任何NSObject的子类都可以直接存入数据库
1、新增了更新表结构的方法,现在不再自动更新表结构了,而是需要手动更新
版本 0.3
0、兼容swift
1、修复了使用runtime时的内存回收问题
版本 0.2
0、完善了DEMO
1、新增删除
2、新增查询功能,包括模糊查询、复合条件查询
3、新增批量添加功能
4、添加对部分有较高延迟的指令的异步执行方法
5、优化了性能,修复了已知bug
版本 0.1.1
0、增加数据删除功能
1、修复一个初始化阶段导致死循环的bug
版本 0.1
0、自动创建、维护模型对应的数据库。启动时检测模型变化,如属性发生变更则自动更新数据表。
1、支持NSString、NSDate、NSData、CGFloat、NSInteger、float、double等基本类型。
2、支持任何实现了NSCoding接口的对象。
3、特别优化了TODBModel的子类作为属性的支持。