本人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)。