iOS中SQLite使用教程


当前第2页 返回上一页

免费版的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教程(十):内存数据库和临时数据库

深入Sqlite基本操作的总结详解

Sqlite expert pro5.0如何安装可视化数据库管理软件激活教程

c#连接sql数据库和查询数据功能的操作技巧

python etl工具 pyetl

android 数据存储方式有哪几种

Sqlite中文乱码问题原因分析及解决

android sharepreferences与数据库Sqlite存储实现方法介绍

c# Sqlite数据库入门使用说明

linux中安装部署docker管理工具drone全攻略

更多相关阅读请进入《Sqlite》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

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



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...