Swift学习教程之SQLite的基础使用

论坛 期权论坛 脚本     
niminba   2021-5-23 03:43   1465   0

前言

在我们的日常开发中,经常会遇到用户断网或者网络较慢的情况,这样用户在一进入页面的时候会显示空白的页面,那么如何避免没网显示空白页面的尴尬呢?答案就是:先在网络好的时候缓存一部分数据,这样当下次网络情况不好的时候,至少用户可以先看到之前缓存的内容,已达到提高APP的用户体验。

SQLite就是我们实现本地数据缓存的一种方案,SQLite有以下优点:iOS内嵌SQLite;经过时间的验证;开源;跨平台。
OK,废话不多说,现在我们就开始进入SQLite的体验之旅。当然在开始之前我们要做一点准备工作,毕竟我们不打没有准备的仗。

准备工作

创建备用数据

  • 导入SQLite3:import SQLite3
  • 创建一个Goods的类用来表示数据库存储的数据类型
  • 创建一个Goods类型的数组
  • 声明一个dbPath和db的全局变量,声明一个获取libraryDirectory路径的函数(数据库存放路径如何选择

代码如下:

class Goods {
 let name: String!
 let weight: Int!
 var price: Double!
 
 init(name: String, weight: Int, price: Double) {
  self.name = name
  self.weight = weight
  self.price = price
 }
}

let goods = Goods(name: "computer", weight: 10, price: 2000.0)
var goodArr = [Goods]()
var dbPath = ""
var db: OpaquePointer?

func createData() {
 for index in 0...4 {
  let goods = Goods(name: "computer" + "\(index)", weight: index * 10, price: 20.0)
  goodArr.append(goods)
 }
}

func fetchLibraryPath() {
 if let libraryPathString = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true).first {
  let pathURL = URL(fileURLWithPath: libraryPathString).appendingPathComponent("goods.sqlite")
  dbPath = pathURL.path
 }
}

创建并连接数据库

func openDatabase() -> OpaquePointer? {
 var db: OpaquePointer?
 if sqlite3_open(dbPath, &db) == SQLITE_OK {
  resultLabel.text = "成功打开数据库,路径:\(dbPath)"
  return db
 } else {
  resultLabel.text = "打开数据库失败"
  return nil
 }
}

通过上面的代码我们可以看到,首先声明了一个OpaquePointer类型的可选值db,接下来调用了sqlite3_open()方法,该方法的作用是:如果之前创建了数据库那么直接打开,若没创建会直接创建一个。如果该方法调用成功,他会返回一个OpaquePointer的值赋值给你传递进去的db。

SQLITE_OK是一个定义在SQLite库中的一个常量,它代表一个Int32的0。SQLite的大多数函数都会返回一个Int32的值,例如SQLITE_ROW (100)、SQLITE_DONE (101)等,详细列表你可以查看这里

现在你可以通过调用db = openDatabase()来打开或者创建一个数据库了,正常情况下你会看见成功打开数据库,路径:xxx/xxx.sqlite的输出。

现在,我们已经成功的创建了一个名字为goods.sqlite的数据库了,接下来我们要做的就是创建一个表了。

创建表

代码

func createTable() {
 let createTableString = """
       CREATE TABLE Computer(
       Id INT PRIMARY KEY NOT NULL,
       Name CHAR(255),
       Weight Int,
       Price Float);
       """
 var createTableStatement: OpaquePointer?
 // 第一步
 if sqlite3_prepare_v2(db, createTableString, -1, &createTableStatement, nil) == SQLITE_OK {
  // 第二步
  if sqlite3_step(createTableStatement) == SQLITE_DONE {
   resultLabel.text = "成功创建表"
  } else {
   resultLabel.text = "未成功创建表"
  }
 } else {
   
 }
 //第三步
 sqlite3_finalize(createTableStatement)
}

代码说明

首先解释一下createTableString:创建一个名字为Computer的表,Id为主键且不为空,Name不超过255个字符,Weight为Int类型,Price为Float类型。
然后创建了一个OpaquePointer?类型的变量用于下面的函数:sqlite3_prepare_v2()。

  • 第一步:该函数会将createTableString编译为字节代码(byte code)并返回一个status code,这个函数执行成功则表明database已经准备好了执行任意的SQL statement(就是创建的SQL的字符串),该函数执行成功后即会执行sqlite3_step()。
  • 第二步:sqlite3_step()用来执行编译完成的statement handle(createTableStatement)并返回一个status code。
  • 第三步:在你每一次的操作完成后你必须调用sqlite3_finalize()去删除你的statement以避免resource leak。注意:一旦一个statement被finalized,你不应该再一次使用它。
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP