日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發布時間:2025/3/12 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 swift使用mysql教程,Swift学习教程之SQLite的基础使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

在我們的日常開發中,經常會遇到用戶斷網或者網絡較慢的情況,這樣用戶在一進入頁面的時候會顯示空白的頁面,那么如何避免沒網顯示空白頁面的尷尬呢?答案就是:先在網絡好的時候緩存一部分數據,這樣當下次網絡情況不好的時候,至少用戶可以先看到之前緩存的內容,已達到提高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,你不應該再一次使用它。

插入一條數據

代碼

func insertOneData() {

let insertRowString = "INSERT INTO Computer (Id, Name, Weight, Price) VALUES (?, ?, ?, ?);"

var insertStatement: OpaquePointer?

//第一步

if sqlite3_prepare_v2(db, insertRowString, -1, &insertStatement, nil) == SQLITE_OK {

let id: Int32 = 1

//第二步

sqlite3_bind_int(insertStatement, 1, id)

sqlite3_bind_text(insertStatement, 2, goods.name, -1, nil)

sqlite3_bind_int(insertStatement, 3, Int32(goods.weight))

sqlite3_bind_double(insertStatement, 4, goods.price)

//第三步

if sqlite3_step(insertStatement) == SQLITE_DONE {

resultLabel.text = "插入數據成功"

} else {

resultLabel.text = "插入數據失敗"

}

} else {

}

//第四步

sqlite3_finalize(insertStatement)

}

代碼說明

insertRowString中的?和前面的字段是對應的,它只是占位符的意思,告訴編譯器當真正執行該語句的時候會插入相應的值。

第二步:sqlite3_bind_int()標識你綁定了一個Int類型的值,該函數的第一個參數是你的statement(即insertStatement),第二個參數是?的位置在你的statement(注意該值是非零的),在此處也就是1,第三個參數為你想綁定的值。sqlite3_bind_text()函數表示你綁定的是一個text(一般用于比較長的字符串)類型值,該函數比sqlite3_bind_int()多了額外的兩個參數,第四個參數的意思是text的字節數,一般穿-1,第五個參數是一個closure回調,處理完string后調用。

第三步第四步同上

插入多條數據

代碼

func insertMutipleData() {

let insertRowString = "INSERT INTO Computer (Id, Name, Weight, Price) VALUES (?, ?, ?, ?);"

var insertStatement: OpaquePointer?

//第一步

if sqlite3_prepare_v2(db, insertRowString, -1, &insertStatement, nil) == SQLITE_OK {

for (index, good) in goodArr.enumerated() {

let id: Int32 = Int32(index + 1)

//第二步

sqlite3_bind_int(insertStatement, 1, id)

sqlite3_bind_text(insertStatement, 2, good.name, -1, nil)

sqlite3_bind_int(insertStatement, 3, Int32(good.weight))

sqlite3_bind_double(insertStatement, 4, good.price)

//第三步

if sqlite3_step(insertStatement) == SQLITE_DONE {

resultLabel.text = "插入數據成功"

} else {

resultLabel.text = "插入數據失敗"

}

//第四步

sqlite3_reset(insertStatement)

}

} else {

}

//第五步

sqlite3_finalize(insertStatement)

}

代碼說明

insertRowString同上。

第四步:調用sqlite3_reset()函數,以便下次循環再次執行insertStatement

第一步、第二步、第三步、第五步同上。

更新數據

代碼

func updateData() {

let updateString = "UPDATE Computer SET Name = 'changeComputer' WHERE Id = 2;"

var updateStatement: OpaquePointer?

//第一步

if sqlite3_prepare_v2(db, updateString, -1, &updateStatement, nil) == SQLITE_OK {

//第二步

if sqlite3_step(updateStatement) == SQLITE_DONE {

resultLabel.text = "更新成功"

} else {

}

}

//第三步

sqlite3_finalize(updateStatement)

}

代碼說明

updateString:將Id==2的數據的Name字段改為changeComputer。

sqlite3_prepare_v2():準備,sqlite3_step():執行更新statement,sqlite3_finalize():結束。

刪除數據

代碼

func deleteData() {

let deleteString = "DELETE FROM Computer WHERE Id = 2;"

var deleteStatement: OpaquePointer?

//第一步

if sqlite3_prepare_v2(db, deleteString, -1, &deleteStatement, nil) == SQLITE_OK {

//第二步

if sqlite3_step(deleteStatement) == SQLITE_DONE {

resultLabel.text = "刪除成功"

}

} else {

}

//第三步

sqlite3_finalize(deleteStatement)

}

代碼說明

deleteString:刪除表中Id==2的數據。

sqlite3_prepare_v2():準備,sqlite3_step():執行刪除statement,sqlite3_finalize():結束。

查詢一條數據

代碼

func queryOneData() {

let queryString = "SELECT * FROM Computer WHERE Id == 2;"

var queryStatement: OpaquePointer?

//第一步

if sqlite3_prepare_v2(db, queryString, -1, &queryStatement, nil) == SQLITE_OK {

//第二步

if sqlite3_step(queryStatement) == SQLITE_ROW {

//第三步

let id = sqlite3_column_int(queryStatement, 0)

let queryResultName = sqlite3_column_text(queryStatement, 1)

let name = String(cString: queryResultName!)

let weight = sqlite3_column_int(queryStatement, 2)

let price = sqlite3_column_double(queryStatement, 3)

resultLabel.text = "id: \(id), name: \(name), weight: \(weight), price: \(price)"

} else {

resultLabel.text = "error"

}

}

//第四步

sqlite3_finalize(queryStatement)

}

代碼說明

queryString:在Computer表中查找所有Id == 2的數據。

第二步:注意此時要判斷的status code為SQLITE_ROW,如果該判斷為true則代表你查詢的數據存在在表里。

第三步:sqlite3_column_int()函數是按照列數取數據,第一個參數是statement,第二個參數則是該字段是第幾列(Id 為表里的第一列,從0開始計算)。sqlite3_column_text()要略微復雜一點,他需要轉換類型通過String(cString: queryResultName!)。

第一步、第四步同上

查詢多條數據

代碼

func queryAllData() {

let queryString = "SELECT * FROM Computer;"

var queryStatement: OpaquePointer?

//第一步

if sqlite3_prepare_v2(db, queryString, -1, &queryStatement, nil) == SQLITE_OK {

//第二步

while(sqlite3_step(queryStatement) == SQLITE_ROW) {

//第三步

let id = sqlite3_column_int(queryStatement, 0)

let queryResultName = sqlite3_column_text(queryStatement, 1)

let name = String(cString: queryResultName!)

let weight = sqlite3_column_int(queryStatement, 2)

let price = sqlite3_column_double(queryStatement, 3)

resultLabel.text = "id: \(id), name: \(name), weight: \(weight), price: \(price)"

}

}

//第四步

sqlite3_finalize(queryStatement)

}

代碼說明

第二步:此處為while循環,當查詢到最后一行時會返回SQLITE_DONE狀態碼來結束。

第一步第三步第四步同上。

小結

通過上面我們可以總結出執行一個statement的大概流程:sqlite3_prepare_v2():準備,sqlite3_step():執行statement,sqlite3_finalize():結束。好了,到這里SQLite3的增刪改查基本操作也就完事了。下一篇我們來了解一下SQLite的進階用法。Bye~

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的swift使用mysql教程,Swift学习教程之SQLite的基础使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。