美文网首页
数据持久化—SQLite数据库

数据持久化—SQLite数据库

作者: bu再等 | 来源:发表于2016-02-25 13:31 被阅读152次

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

    相关文章

      网友评论

          本文标题:数据持久化—SQLite数据库

          本文链接:https://www.haomeiwen.com/subject/ggiikttx.html