FMDB数据库简化操作以及大数据存储优化
简述使用第三方封装库原因
简述使用第三方库简化原因:
- FMDB在使用过程中常常后台数据模型字段改变就需要对原有的建表,插入,读取代码进行更改。
重复更改影响效率。 - 字段多数据类型多样转型麻烦。
- 实际使用项目中常常需要不同用户不同数据库路径
附上FMDB官方连接:
FMDB
第三方封装库
下面介绍的FMDB封装简化库 RUNTime动态获取模型属性 大多参考LKDaoBase这个库
Star 320
特点:
- 自动创建数据库、自动创建数据库表。
- 自动检测字段添加新字段。
- 一行代码实现数据库的CURD操作。
- 源码及其简单,易于理解和掌握。
- 扩展自己的功能也非常得简单,容易。
- 支持多线程,非线程阻塞。
- 支持arc和mrc。
缺点:
SQLite 默认支持五种数据类型TEXT、INTEGER、REAL、BLOB、NULL。
JKDBModel只做了少数类型的判断,
如:int、unsigned int、short、unsigned short、BOOL,对象类型默认是字符串。
star 587
与LKDaoBase源自一个作者。
特点:
1.支持的属性类型多
Supported NSArray,NSDictionary, ModelClass, NSNumber, NSString, NSDate, NSData, UIColor, UIImage, CGRect, CGPoint, CGSize, NSRange, int,char,float, double, long.. attribute to insert and select automation.
全面支持 NSArray,NSDictionary, ModelClass, NSNumber, NSString, NSDate, NSData, UIColor, UIImage, CGRect, CGPoint, CGSize, NSRange, int,char,float, double, long.. 等属性的自动化操作(插入和查询)
2.功能比较全面
除一般的数据库存储工作还支持数据库地址的更换,表字段升级,表外键(数据库都支持,这个库只是封装了下)。
具体使用说明可以点击连接看github上的使用说明。
用户数据库区分
实际使用过程中可以用一个单例保存用户登陆的登陆名。用户登陆后
使用
[[LKDBHelper alloc]initWithDBPath:dbpath]
创建用户数据库目录。
数据库版本更新
现用的方案,本地用userdefult保存数据库数据版本号。用户登录后比对最新版本号与本地版本号。更新方式采用全部清除表数据再从新插入数据的方式来同步最新的数据库数据。网上有种使用sql语句跟新的方式跟新性能上相对好点,实现上比较麻烦需要封装一个执行SQL语句函数并且表名字段名需要与服务端保持一致。现有的方式
通过以下方式优化:
- 数据插入的时候以Sql字段的方式插入不用模型(减少内存使用,与dic转模型转换时间)
- 使用事务处理方式,并开启数据缓存。
性能实测:
笔者当时做的一个项目,用户使用过程时常会需要更新服务端的数据库信息同步,服务端没有做增量增减每次传出来的json数据都为整个数据库的数据。因此每次同步都需要一次性将所有的数据进入本地数据库。
9000条模型数据
优化前 10分钟左右 (插入函数对FMDB封装,一次插入一条模型数据) 优化后 1~2s
核心代码
- (void)intsertStationData:(NSArray *)dataArray
{
self.databaseQueue = [FMDatabaseQueue databaseQueueWithPath:Path];
[self.databaseQueue inDatabase:^(FMDatabase *db) {
[db open];
[db setShouldCacheStatements:YES];
NSString * insertSql1= [NSString stringWithFormat:
@"INSERT INTO '%@' (vipLevel, agent, site,level,manager,district,name,indoor,lon,lat,StationID,netKind) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)",
KtableName];
[db beginTransaction];
for (NSDictionary *Basedic in dataArray) {
double latModify = [Basedic[@"lat"] doubleValue]+ 0.00328;
double lonModify = [Basedic[@"lon"] doubleValue]+ 0.01185;
[db executeUpdate:insertSql1,
Basedic[@"vipLevel"],
Basedic[@"agent"],
Basedic[@"site"],
Basedic[@"level"],
Basedic[@"manager"],
Basedic[@"district"],
Basedic[@"name"],
Basedic[@"inDoor"],
[NSString stringWithFormat:@"%f",lonModify],
[NSString stringWithFormat:@"%f",latModify],
Basedic[@"id"],
Basedic[@"netKind"]
];
}
[db commit];
[db close];
}];
}