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.
备选2个SQLite可视化的管理工科具,我用的是SQLiteManager,
当然你能够选用你用着顺手的管理工科具(自行百度呢)。当然假诺你是初大方,并想“自伤”一下话,能够从官网上Download一个称作sqlite-shell的事物,用纯命令行去管理你的SQLite数据库。其实假如习惯了,用纯命令依然用着相比爽的,终究能够用来装13不是么!
SQLite官网上有详细的Shell操作命令:怎么样去创建数据库,如何创立表等一多级的操作,前天不做赘述。(若是您前边搞过MySQL,
Oracle等,应该对命令行操作数据库再熟谙然则了)。

    3.
你能够通过SQLiteManager来创设多个数据库插入一些测试数据,以备在大家的测试工程中进行利用。也许你可以懒一些,直接从网上Download多个现成的SQLite数据库实行操作使用(作者下载了贰个名叫Cars.sqlite文件来举行测试,数据库的表结构及数量如下所示)。

图片 1

 

  贰 、打开你的数据库

    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.你须求定义2个sqlite3结构体类型的指针变量,打开数据库后能够获得那么些sqlite3结构体指针的值,并赋值给后面对应的指针变量,然后就足以经过该sqlite3结构体指针变量来操作数据库。上面定义了一个sqlite3结构体类型的指针变量,然后把该指针变量的地方传给sqlite3_open()函数,函数参数传入的引用,在C语言中就足以获得数据库操作指针。为了便于精通,能够把sqlite3结构体当做3个类,而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);
    }

 

图片 2

    

    sqlite3_open()正是三个构造函数,
此外还有sqlite3_open16()和sqlite3_open_v2(),
他们的功效都是开拓三个新的数据库的接连,所需参数如下所示。这几个构造函数可以因而数据库文件名称参数来连接1个数据库。即便文件名参数是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()是后来改正的方法。

图片 3

    参数flag,分歧的值代表着打开数据库后得以赢得的两样操作,类似于数据库的操作权限,下方是flag的值代表的操作权限。

    SQLITE_OPEN_READONLY 数据库是只读情势打开。假诺数据库不设有,则赶回二个不当。

    SQLITE_OPEN_READW福睿斯ITE 数据库以读写的格局打开,
假诺文件被操作系统设置为拥戴方式,那么就为只读情势。在那三种状态下的数据库必须已经存在,不然会重返三个不当。

    SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE 数据库以读写的格局打开,
尽管数据库不设有,就创设一个。使用sqlite3_open()和sqlite3_open16()连接数据库时,暗许的正是这种作为。

    如果sqlite3_open_v2()的第陆个参数不带有上述三种组成人中学的2个来说,那么数据库的一连权限是未定义的。也正是说数据库不清楚是读还是写,照旧创立,所以操作数据库就从不意义了,所以地方必须选取一个涉足“与”运算。

    SQLITE_OPEN_NOMUTEX 只要单线方式下没有设置编写翻译的发轫时间,就会在四线程格局下进行数据库的接二连三。

    SQLITE_OPEN_FULLMUTEX
在体系化的线程形式(在此方式中,SQLite能无束缚地在四线程中平安接纳)打开数据库连接,除非在编写翻译时只怕单线程在此之前选用初步时间。

    SQLITE_OPEN_SHAREDCACHE
能够使数据库连接适当的运用共享缓存格局,无论是或不是采取sqlite3_enable_shared_cache()启用共享缓存。

    SQLITE_OPEN_PPAJEROIVATECACHE
导致数据库连接不利用共享缓存形式,就算共享缓存模型可用。

图片 4

 

    sqlite3_open_v2()第多少个参数是sqlite3_vfs对象的名称,它定义了操作系统接口应该利用新的数据库连接。借使第5个参数是1个nil的话,那么就会使用默许sqlite3_vfs对象。下方是布局体sqlite3_vfs的具体内容:

图片 5

 

    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

    在博客的尾声吧,给出不难包装的开辟数据库的章程:

 1 /*******************************
 2  *功能:打开数据库
 3  *参数:databaseName -- 数据库名称
 4  *返回:数据库对象(sqlite3对象)
 5  *******************************/
 6 + (sqlite3 *) openDatabaseWithName: (NSString *)databaseName{
 7     
 8     //获取Sqllite文件的路径
 9     NSString *sqlPath = [[NSBundle mainBundle] pathForResource:databaseName ofType:@"sqlite"];
10     
11     //把路径转成C字符串
12     const char * filePath = [sqlPath UTF8String];
13     
14     sqlite3 * database;
15     
16     //打开数据库
17     int result = sqlite3_open(filePath, &database);
18     
19     if (result == SQLITE_OK) {
20         return database;
21     }
22     
23     return nil;
24 
25 }
网站地图xml地图