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

 

  二、打开你的数据库

    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);
    }

 

图片 2

    

    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()是新兴改进之法。

图片 3

    参数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
导致数据库连接不应用共享缓存模式,即使共享缓存模型可用。

图片 4

 

    sqlite3_open_v2()第四个参数是sqlite3_vfs对象的名,它定义了操作系统接口应该用初的数据库连接。如果第四单参数是一个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地图