免费版的SQLite有一个致命缺点:不支持加密。这就导致存储在SQLite中的数据可以被任何人用任何文本编辑器查看到。
对数据库加密的思路有两种:
1. 将内容加密后再写入数据库
这种方式使用简单,在入库/出库只需要将字段做对应的加解密操作即可,一定程度上解决了将数据赤裸裸暴露的问题。
不过这种方式并不是彻底的加密,因为数据库的表结构等信息还是能被查看到。另外写入数据库的内容加密后,搜索也是个问题。
2. 对数据库文件加密
将整个数据库整个文件加密,这种方式基本上能解决数据库的信息安全问题。目前已有的SQLite加密基本都是通过这种方式实现的。这里就介绍一个开源的加密工具SQLCipher,安装方法可以参照官网文档,https://www.zetetic.net/sqlcipher/ios-tutorial/,SQLCipher使用256-bit AES加密,由于其基于免费版的SQLite,主要的加密接口和SQLite是相同的,但也增加了一些自己的接口。
其实SQLite的两个加密函数使用起来非常的简单,下面分情况说明:
1 给一个未加密的数据库添加密码:如果想要添加密码,则可以在打开数据库文件之后,关闭数据库文件之前的任何时刻调用sqlite3_key函数即可,该函数有三个参数,其中第一个参数为数据库对象,第二个参数是要设定的密码,第三个是密码的长度。例如:sqlite3_key(db,”1q2w3e4r”,8); //给数据库设定密码1q2w3e4r
2 读取一个加密数据库中的数据:完成这个任务依然十分简单,你只需要在打开数据库之后,再次调用一下sqlite3_key函数即可,例如,数据库密码是123456时,你只需要在代码中加入sqlite3_key(db,”123456″,6);
3更改数据库密码:首先你需要使用当前的密码正确的打开数据库,之后你可以调用sqlite3_rekey(db,”112233″,6) 来更改数据库密码。
4 删除密码:也就是把数据库恢复到明文状态。这时你仍然只需要调用sqlite3_rekey函数,并且把该函数的第二个参数置为NULL或者””,或者把第三个参数设为0。
事务操作
那么问题又来了,如果iOS的sqlite同时插入或者查询10000条数据,你该怎么办?
这里有三步要做,第一,减少开关数据库操作,插入10000条数据,不能开关10000次数据库,只能进行一次开关;
第二,就是不能放在主线程;
第三,最重要的一点就是加入事务操作。
事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。所以10000次磁盘操作可能几分钟都做不完,这个时候需要把10000条语句都封装成一个事务。
下面就是开始事务和提交事务的代码了
-(int)beginService{ char *errmsg; int rc = sqlite3_exec(database, "BEGIN transaction", NULL, NULL, &errmsg); return rc; } -(int)commitService{ char *errmsg; int rc = sqlite3_exec(database, "COMMIT transaction", NULL, NULL, &errmsg); return rc;}
接下来就把三个操作合并
-(int)addModelsTest:(NSArray *)models error:(NSError **) error{ char *errmsg; __block NSMutableArray *sqls=[NSMutableArray array]; __block NoticeModel *aModel=[[NoticeModel alloc] init]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ for (int i=0; i<100000; i++) { aModel=[models objectAtIndex:0]; NSString *sql=[NSString stringWithFormat:@"insert into notices values('%lf','%d','%@','%@','%@','%d','%d','%d','%d','%@')",aModel.myID,aModel.news_id,aModel.news_title,aModel.content,aModel.pic,aModel.sort,aModel.record_status,aModel.counter,aModel.suid,aModel.publish_time]; [sqls addObject:sql]; } int r1=[self open]; [self beginService]; int rc; int i; for (i=0; i<100000; i++) { rc=sqlite3_exec(database, [[sqls objectAtIndex:i] UTF8String], NULL, NULL, &errmsg); } [self commitService]; [self close]; if (i ==100000) { dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"call back, the data is: %@", i); }); } else { NSLog(@"error when download:%@", error); } }); return 0; }
有关iOS中SQLite使用教程小编就给大家介绍这么多,希望对大家有所帮助!
标签:SQLite
相关阅读 >>
Sqlite expert pro5.0如何安装可视化数据库管理软件激活教程
android sharepreferences与数据库Sqlite存储实现方法介绍
更多相关阅读请进入《Sqlite》频道 >>

数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。