数据持久化—SQLite数据库

本人ios初学者,为自己学习方便,复制各位大神的学习性文章放在自己简书里,仅作为自己学习方便使用,如果作者疑此行为侵权,请随时联系本人删除,如有共同学习者复制此文章,请注明原出处


写在前面


SQLite数据库是相比SQLServer、MySQL来说比较轻型的一款数据库,在iOS当中,提供了一套比较完整的基于C语言的库,可以用来对SQLite进行操作。不过由于SQLite在swift这个语言当中支持很不好,并且会导致代码量比较冗余,因此一般情况下并不推荐大家使用SQLite来进行存储,而是使用iOS对其的封装——Core Data。

不过,确实出于一些原因大家可能要使用SQLite,那么我也对如何在swift当中如何使用SQLite数据库进行了一番研究,参考了许多资料,现在整理出来如下:

引入SQLite数据库框架

由于SQLite数据库框架并不属于swift整合的Cocoa框架,因此需要引入SQLite框架。引入的方法很简单,在项目本身的 General 下面找到 Linked Frameworks and Libraries 这一项,然后链接"libsqlite3.dylib"库即可。

引入libsqlite3.dylib库

然后,由于这个库是基于C语言来进行使用的,因此我们需要使用一个OC桥接的头文件来进行操作。添加OC桥接头文件的方法有很多,在此我就不就详细介绍了:

1.自行创建一个.m文件,然后XCode会提示您是否添加桥接头文件,选择确认后,桥接头文件便创建成功了,名为"\(您项目的名称)-Bridging-Header.h"。

添加桥接头文件

2.自行添加一个.h文件,然后在项目设置的Bulid Setting->Swift Compiler - Code Generation->Objective-C Bridging Header中添加这个头文件的路径。

Build Setting里面的OC桥接头文件设置

创建完毕后,在这个桥接头文件下面输入以下语句来引入对这个头文件的引用。

#import"sqlite3.h"

创建数据库

创建SQLite数据库的方法很简单,只需要一个sqlite3_open()方法即可完成。这个方法如果数据库存在,则执行“打开”数据库的操作,如果数据库不存在,则执行“创建”数据库的操作。

sqlite3_open()接收两个参数,第一个参数是数据库文件的路径,第二个参数是一个输出参数,返回一个到数据库的引用。一般情况下代码如下:

vardatabase:COpaquePointer=nil

varopenDatabaseResult = sqlite3_open(数据库文件路径, &database)

第一个参数虽然接受的对象类型是const char *,但是由于Swift的强大兼容性,因此其普通的String类型可以转换为这个类型,也就是说可以直接输入一个String类型进去。但是NSString类型却不能,就必须要使用NSString类型的UTF8String这个方法来获得NSString对象对应的char *类型字符串。

由于第二个参数要返回一个到数据库的引用,因此我们就必须要创建一个模糊结构的指针对象:COpaquePointer来对这个C语言特有的方法来处理。开始这个指针指向空的地方,然后执行完sqlite3_open()这个方法后,这个database便指向了所创建或者打开的数据库。要注意&引用标识不能遗漏了。

这个方法将会返回一个Int32类型,标定了执行的结果。如果返回结果是SQLITE_OK(宏定义值,实际值为1),那么就表明数据库成功打开,而如果返回结果是SQLITE_ERROR,就表明数据库打开失败。具体列表大家可以去sqlite3.h文件中详看。

关闭数据库

在对数据库进行操作完毕后(无论是打开数据库,还是插入、删除、查询数据等等),都应该将数据库关闭,以释放线程和内存空间。而执行关闭数据库的方法很简单:

sqlite3_close(database)

对数据库进行操作

对数据库进行操作一般来说指的是对数据库进行插入、删除和更新等等,比如说添加、删除表之类的操作。而对数据库进行操作的话,则一般情况下是使用sqlite3_exec()这个函数来执行SQL语句。SQL语句才是SQLite数据库的操作重点,不是么?

var createSQL = "CREATETABLEIFNOTEXISTSTEXTFILED (IDINTEGERPRIMARYKEYAUTOINCREMENT,TEXTTEXT)"

var errorMessage: UnsafeMutablePointer = nil

var createTableResult = sqlite3_exec(database, createSQL, nil, nil, &errorMessage)

对于Swift语言来说,SQL语言的输入很简单,只需要把它弄在String类型里面就可以了,但是没有代码提示……也没有错误提示……因此,需

要很高的SQL语言水准。在这里,我的例子中就是简单的创建一个名为“TEXTFILED”的表,它里面含有一个自增的主键ID,属于整型,然后还包含一

个TEXT类型的TEXT属性。

下一个则是定义了一个报错信息,这个是为后面函数做准备的,具体原理和之前介绍的database那货差不多,都是引用啥的……

重点就是sqlite3_exec这个函数,这个函数接收5个参数。第一个参数是要执行操作的数据库,第二个参数是要执行的SQL语句,第三个参数是指定操作接收后的回调函数,一般可以不用,第四个参数是传递给回调函数的参数,第五个参数是用来存储执行出现异常时的错误消息。

如果要执行INSERT、UPDATE、DELETE等操作,只需要相应的更换SQL语句就可以了。至于怎么写SQL语句,不在本文的讨论范围内。

执行数据库查询

使用数据库查询的话,一般推荐使用sqlite3_prepare_v2()方法,这个方法将查询结果存放在一个区域当中,同样的这个区域我们仍然还是使用指针来指定。

varsavedData:COpaquePointer=nil

varselectSQL ="SELECT ID, TEXT FROM TEXTFILED"

varselectDataResult = sqlite3_prepare_v2(database, selectSQL, -1, &savedData,nil)

whilesqlite3_step(savedData) ==SQLITE_ROW{

          varID= sqlite3_column_int(savedData,0)

          vartext =String.fromCString(UnsafePointer(sqlite3_column_text(savedData,1)))            textfield.text ="ID\(ID):\(text!)"

}sqlite3_finalize(savedData)

首先我们先定义了一个SQL查询语句,就是从TEXTFILED表中查询ID和TEXT字段。

然后就调用sqlite3_prepare_v2这个方法,第一个参数仍然是要执行操作的数据库,第二个参数则是要执行的SQL语句,第三个参数则是SQL语句所可以接受的最大长度,第四个参数则是返回的结果,实际上是一个结构体,第五个参数则是指向SQL语句未使用部分的指针。一般情况下,我们使用的就是1、2、4这三个参数。

savedData这个参数和database是一致的,这个方法返回的结果都存储在了savedData里面,由于其实质是一个结构体,因此我们可以用while循环来读取。

使用sqlite3_step()这个方法可以一行一行地从结果中取出数据,然后返回没一行的所有数据。然后就可以通过sqlite3_column_int、sqlite3_column_text等方法来取出每一个字段的值。

要注意的是,在使用·sqlite3_column_text·取出返回值的时候,由于这个方法返回的是UnsafePointer,而String的fromString方法则只能接收UnsafePointer类型的方法,因此需要使用相应的构造器来对其进行转换。

最后,当查询完成后,要使用函数sqlite3_finalize来释放掉所查询的数据(这个C语言函数并不支持ARC)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容