iOS开发之SQLite-C语言接口规范(一)——Ready And Open Your SQLite
为什么要搞一搞SQLite的C语言接口规范呢? 因为在做iOS开发中难免会遇到操作数据库的情况,你可以使用第三方的FMDB等,或者使用CoreData。但我们还是有必要去搞清楚如何去使用SQLite的C语言接口来操作SQLite数据库的。从今天开始就给大家结合实例详细的搞一搞SQLite的C语言接口。关于CoreData的东西请看之前的博客《IOS开发之表视图爱上CoreData》。
如果英文好的小伙伴呢,你可以不听我啰嗦,直接官网走起:http://www.sqlite.org 上面的东西是应有尽有,你可以下载资源如SQLite的Shell, 上面还有好多的学习资源。不过前提是英文不能太Low呢。之前看过几本iOS开发的书籍,也包括某某出版社出版的《精通iOS开发》,虽然网上评价不错,但看书的时候总是不来感。大部分书上介绍的SQLite, 讲的太浅,只是罗列代码,接口参数是什么意思,为什么这么写都没讲。看书看的不爽了,就到官网上找找安慰吧,果不其然,眼前一亮。就写几篇博客好好的总结一下。
一、准备SQLite测试工程和所需工具
1. 准备一个已经引入动态链接库libsqlite3.0.dylib的iOS单视图工程(当然,看你心情,你也可以创建一个控制台工程,这不是重点)。
2. 准备一个SQLite可视化的管理工具,我用的是SQLiteManager, 当然你可以选择你用着顺手的管理工具(自行百度吧)。当然如果你是初学者,并想“自残”一下话,可以从官网上Download一个叫做sqlite-shell的东西,用纯命令行去管理你的SQLite数据库。其实如果习惯了,用纯命令还是用着比较爽的,毕竟可以用来装13不是么! SQLite官网上有详细的Shell操作命令:如何去创建数据库,如何创建表等一系列的操作,今天不做赘述。(如果你之前搞过MySQL, Oracle等,应该对命令行操作数据库再熟悉不过了)。
3. 你可以通过SQLiteManager来创建一个数据库插入一些测试数据,以备在我们的测试工程中进行使用。或者你可以懒一些,直接从网上Download一个现成的SQLite数据库进行操作使用(我下载了一个叫做Cars.sqlite文件来进行测试,数据库的表结构及数据如下所示)。
二、打开你的数据库
1.把准备好的测试SQLite数据库引入到我们的测试工程中。
2.通过NSBundle加载我们的数据库资源
//获取Sqllite文件的路径
NSString *sqlPath = [[NSBundle mainBundle] pathForResource:@"Cars" ofType:@"sqlite"];
3.因为是C语言接口,参数所用的字符串都是C语言中的字符串,所以呢得把字符串转成C语言中的字符串吧(也就是C语言中char类型的指针)
//把路径转成C字符串
const char * filePath = [sqlPath UTF8String];
4.你需要定义一个sqlite3结构体类型的指针变量,打开数据库后可以获取这个sqlite3结构体指针的值,并赋值给之前对应的指针变量,然后就可以通过该sqlite3结构体指针变量来操作数据库。下面定义了一个sqlite3结构体类型的指针变量,然后把该指针变量的地址传给sqlite3_open()函数,函数参数传入的引用,在C语言中就可以得到数据库操作指针。为了便于理解,可以把sqlite3结构体当做一个类,而sqlite3结构体的指针可以看做是类的对象。
sqlite3 * database; //打开数据库
int result = sqlite3_open(filePath, &database);
通过上述步骤就可以获取到操作数据库的结构体指针,sqlite3_open()函数,第一个参数就是C字符串格式的数据库文件的路径,第二个参数就是结构体指针的地址,用于获取操作数据库的句柄。该函数有一个int类型的返回值(0-101),这些返回值对应着不同的链接状态。0代表着成功,其余见下图:
if (result == SQLITE_OK) {
NSLog(@"连接成功");
} else {
NSString *error = [NSString stringWithFormat:@"错误结果代码:%d", result];
NSLog(@"%@", error);
}
sqlite3_open()就是一个构造函数, 另外还有sqlite3_open16()和sqlite3_open_v2(), 他们的功能都是打开一个新的数据库的连接,所需参数如下所示。这些构造函数可以通过数据库文件名称参数来连接一个数据库。如果文件名参数是UTF-8编码格式的, 可以调用sqlite3_open()和sqlite3_open_v2(), 那么如果文件参数是 UTF-16编码的话就调用构造函数sqlite3_open16()。第二个参数就是返回的数据库操作句柄的指针地址。
由下方的图可以看出sqlite3_open_v2()比sqlite3_open()多了两个参数,一个是int flags, 一个是const char *zVfs。 sqlite3_open_v2()的用法和sqlite3_open()类似,可以说前者是后者的加强版。sqlite3_open()是以前的旧方法,而sqlite3_open_v2()是后来改进的方法。
参数flag,不同的值代表着打开数据库后可以获取的不同操作,类似于数据库的操作权限,下方是flag的值代表的操作权限。
SQLITE_OPEN_READONLY 数据库是只读模式打开。如果数据库不存在,则返回一个错误。
SQLITE_OPEN_READWRITE 数据库以读写的模式打开, 如果文件被操作系统设置为保护模式,那么就为只读模式。在这两种情况下的数据库必须已经存在,否则会返回一个错误。
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE 数据库以读写的模式打开, 如果数据库不存在,就创建一个。使用sqlite3_open()和sqlite3_open16()连接数据库时,默认的就是这种行为。
如果sqlite3_open_v2()的第三个参数不包含上述三种结合中的一个的话,那么数据库的连接权限是未定义的。也就是说数据库不知道是读还是写,还是创建,所以操作数据库就没有意义了,所以上面必须选择一个参与“与”运算。
SQLITE_OPEN_NOMUTEX 只要单线模式下没有设置编译的起始时间,就会在多线程模式下进行数据库的连接。
SQLITE_OPEN_FULLMUTEX 在序列化的线程模式(在此模式中,SQLite能无约束地在多线程中安全使用)打开数据库连接,除非在编译时或者单线程之前选择起始时间。
SQLITE_OPEN_SHAREDCACHE 可以使数据库连接适当的使用共享缓存模式,无论是否使用sqlite3_enable_shared_cache()启用共享缓存。
SQLITE_OPEN_PRIVATECACHE 导致数据库连接不使用共享缓存模式,即使共享缓存模型可用。
sqlite3_open_v2()第四个参数是sqlite3_vfs对象的名称,它定义了操作系统接口应该使用新的数据库连接。如果第四个参数是一个nil的话,那么就会使用默认sqlite3_vfs对象。下方是结构体sqlite3_vfs的具体内容:
vfs: sqlite3_vfs对象的实例定义了一个SQLite核心和底层操作系统间的接口。“vfs”对象的名称代表“虚拟文件系统”。关于VFS的详解内容在这里:https://www.sqlite.org/vfs.html 有兴趣的小伙伴可以好好的搞一下。如果以后有时间的话在好好的介绍一下VFS。今天就不做过多的赘述了。第四个参数传入nil就会使用默认的sqlite3_vfs默认对象。
关于VFS和sqlite3_vfs结构体的东西,如果以后有时间,在单独拿出来搞搞。了解VFS的结构和模式还是很有必要的。ok~今天打开并连接数据库,关于如何去通过接口去操作数据库就留在以后的博客中介绍吧。
用到的数据库和sqliteAPI代码GitHub分享地址:https://github.com/lizelu/SQLiteResource
在博客的最后呢,给出简单封装的打开数据库的方法:
/*******************************
*功能:打开数据库
*参数:databaseName -- 数据库名称
*返回:数据库对象(sqlite3对象)
*******************************/
+ (sqlite3 *) openDatabaseWithName: (NSString *)databaseName{ //获取Sqllite文件的路径
NSString *sqlPath = [[NSBundle mainBundle] pathForResource:databaseName ofType:@"sqlite"]; //把路径转成C字符串
const char * filePath = [sqlPath UTF8String]; sqlite3 * database; //打开数据库
int result = sqlite3_open(filePath, &database); if (result == SQLITE_OK) {
return database;
} return nil; }
iOS开发之SQLite-C语言接口规范(一)——Ready And Open Your SQLite的更多相关文章
- iOS开发之Socket通信实战--Request请求数据包编码模块
实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...
- iOS 开发之Block
iOS 开发之Block 一:什么是Block.Block的作用 UI开发和网络常见功能的实现回调,按钮事件的处理方法是回调方法. 1. 按钮事件 target action 机制. 它是将一 ...
- 李洪强iOS开发之Block和协议
李洪强iOS开发之Block和协议 OC语言BLOCK和协议 一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任 ...
- 李洪强iOS开发之iOS社区收集
李洪强iOS开发之iOS社区收集 项目 简述 github 全球最大的代码仓库,无论是iOS开发还是Android开发没有人不知道这个网站,它也是一个社区,你可以去follow(关注)某些人或公司. ...
- 李洪强iOS开发之iOS好文章收集
李洪强iOS开发之iOS好文章收集 该文收集朋友们转发或自己的写的技术文章,如果你也有相关的好文章,欢迎留言,当好文章多的时候,我会对这些好文章进行分门别类 文章 简述 日期 直播服务配置 使用 ng ...
- 李洪强IOS开发之iOS好项目收集
李洪强IOS开发之iOS好项目收集 在这里收集一些最近出现的比较实用好玩的框架或者项目,会不断更新 项目 简述 日期 SCTableViewCell 类似与QQ侧滑删除Cell的Demo 201501 ...
- 李洪强iOS开发之RunLoop的原理和核心机制
李洪强iOS开发之RunLoop的原理和核心机制 搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研 ...
- iOS开发之UISearchBar初探
iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开 ...
- iOS开发之UIImage等比缩放
iOS开发之UIImage等比缩放 评论功能真不错 评论开通后,果然有很多人吐槽.谢谢大家的支持和关爱,如果有做的不到的地方,还请海涵.毕竟我一个人的力量是有限的,我会尽自己最大的努力大家准备一些干货 ...
随机推荐
- CentOS 简单设置samba服务
1.安装 yum -y install samba 2.设置配置文件 1) 备份Samba的配置文件:cp /etc/samba/smb.conf /etc/samba/smb.conf.bak ...
- XCode设置自己windows习惯的快捷键(比如Home、End键)
Xcode的preference(command+,)中可以设置Key Bindings.绑定自己习惯的快捷键.实测系统快捷键设置同样名字也可以生效,但操作比较繁琐这里就不介绍了. 1.打开Xcode ...
- 7_nodejs angularjs
webstrom使用: ctrl+b/点击,代码导航,自动跳转到定义 ctrl+n跳转指定类 ctrl+d复制当前行ctrl+enter另起一行ctrl+y删除当前行 ctrl+alt/shift+b ...
- sql 连接数不释放 ,Druid异常:wait millis 40000, active 600, maxActive 600
Hibernate + Spring + Druid 数据库mysql 由于配置如下 <bean id="dataSource" class="com.alibab ...
- MAC apache配置
启动 apache:在terminal中输入命令,sudo apachectl start 启动成功后访问lcoalhost会显示“It works”. 更改默认路径:命令行输入“sudo vim / ...
- (转)python requests的安装与简单运用
requests是python的一个HTTP客户端库,跟urllib,urllib2类似,那为什么要用requests而不用urllib2呢?官方文档中是这样说明的: python的标准库urllib ...
- 自定义 TableViewCell 的分割线
刚开始自定义 tableViewCell 的时候,用的是直接在 cell 上加一张 imageView 的方法,如果在点击 cell 的时候有页面的跳转,这样做没什么问题,但是,如果在点击 cell ...
- Python之路【第五篇】python基础 之初识函数(一)和文件管理
转载请注明出处http://www.cnblogs.com/wupeiqi/articles/5453708.html 函数 一.背景 ...
- java入门第三步之数据库连接
数据库连接可以说是学习web最基础的部分,也是非常重要的一部分,今天我们就来介绍下数据库的连接为下面学习真正的web打下基础 java中连接数据库一般有两种方式: 1.ODBC——Open Datab ...
- ABP理论学习之领域服务
返回总目录 本篇目录 介绍 IDomainService接口和DomainService类 样例 创建一个接口 服务实现 调用应用服务 一些讨论 何不只使用应用服务 如何强制使用领域服务 介绍 领域服 ...