SQLite函數總結
1.打開數據庫
int sqlite3_open(
const char *filename, // 數據庫的文件路徑
sqlite3 **ppDb // 數據庫實例
);
2.執(zhí)行任何SQL語句
int sqlite3_exec(
sqlite3*, // 一個打開的數據庫實例
const char *sql, // 需要執(zhí)行的SQL語句
int (*callback)(void*,int,char**,char**), // SQL語句執(zhí)行完畢后的回調
void *, // 回調函數的第1個參數
char **errmsg // 錯誤信息
);
3.檢查SQL語句的合法性(查詢前的準備)
int sqlite3_prepare_v2(
sqlite3 *db, // 數據庫實例
const char *zSql, // 需要檢查的SQL語句
int nByte, // SQL語句的最大字節(jié)長度
sqlite3_stmt **ppStmt, // sqlite3_stmt實例,用來獲得數據庫數據
const char **pzTail
);
4.查詢一行數據
int sqlite3_step(sqlite3_stmt*); // 如果查詢到一行數據,就會返回SQLITE_ROW
5.利用stmt獲得某一字段的值(字段的下標從0開始)
double sqlite3_column_double(sqlite3_stmt*, int iCol); // 浮點數據
int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型數據
sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 長整型數據
const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二進制文本數據
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); // 字符串數據
- 如何封裝工具類,來做數據庫操作,總結如下步驟
- 0.封裝?工具類,來做數據庫操作設計成單例
- 1.打開或者創(chuàng)建數據庫sqlite3_open
- 2.創(chuàng)建表sqlite3_exec
- 3.添加/修改/刪除sqlite3_exec
- 4.查詢數據sqlite3_prepare_v2
附上代碼:
存儲對象Person類
import UIKit
class Person: NSObject {
var age : Int = 0
var name : String?
init(dict : [String : AnyObject]) {
super.init()
setValuesForKeysWithDictionary(dict)
}
// MARK:- 和數據庫之間的操作
func insertPerson() {
// 1.獲取插入的SQL語句
let tempName = name == nil ? "" : name!
let insertSQL = "INSERT INTO t_person (name, age) VALUES ('\(tempName)', \(age))"
// 2.執(zhí)行SQL語句
if SQLiteManager.shareIntance.execSQL(insertSQL) {
print("插入成功")
}
}
}
工具類
import UIKit
class SQLiteManager: NSObject {
// let修飾常量是線程安全
static let shareIntance : SQLiteManager = SQLiteManager()
/// 數據庫句柄
var db : COpaquePointer = nil
override init() {
super.init()
openDB("demo.sqlite")
}
/// 提供一個函數,讓別人可以打開一個數據庫
func openDB(dbName : String) {
// 1.獲取數據庫文件存放的路徑
guard var path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first else {
print("沒有獲取到路徑")
return
}
path = (path as NSString).stringByAppendingPathComponent(dbName)
print(path)
// 2.打開數據庫:如果有數據庫則打開,如果沒有則創(chuàng)建
// 參數三:數據庫句柄(類似于游戲手柄).
// COpaquePointer : Swift中是沒有指針,但是在Swift和OC/C開發(fā)過程中使用指針再所難免
SQLITE_OK
if sqlite3_open(path, &db) != SQLITE_OK {
print("打開或者創(chuàng)建數據庫失敗")
return
}
// 3.創(chuàng)建表
createTable()
}
/// 創(chuàng)建一張表
func createTable() {
// 1.獲取創(chuàng)建表的SQL語句
let createTableSQL = "CREATE TABLE IF NOT EXISTS t_person ( \n" +
"id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, \n" +
"name TEXT, \n" +
"age INTEGER\n" +
");"
// 2.執(zhí)行SQL語句
if execSQL(createTableSQL) {
print("創(chuàng)建表成功")
}
}
/// 執(zhí)行SQL語句(創(chuàng)建表/添加/刪除/修改)
func execSQL(sqlString : String) -> Bool {
// 1.參數一:數據庫句柄
// 2.參數二:sql語句
// 3.參數三:執(zhí)行完語句會回調的閉包,一般傳nil即可
// 4.參數四:和參數三相關的一個參數.一般傳nil科技
// 5.參數五:錯誤信息.
return sqlite3_exec(db, sqlString, nil, nil, nil) == SQLITE_OK
}
/// 執(zhí)行查詢操作(將查詢到的結果返回到一個字典數組中)
func querySQL(querySQL : String) -> [[String : AnyObject]]? {
// 1.定義游標指針
var stmt : COpaquePointer = nil
// 2.查詢的準備工作(給stmt賦值)
// 1.參數一:數據庫句柄
// 2.參數二:查詢語句
// 3.參數三:查詢語句的長度. -1是自動計算
// 4.參數四:數據庫`游標`對象
if sqlite3_prepare_v2(db, querySQL, -1, &stmt, nil) != SQLITE_OK {
print("沒有準備好查詢")
return nil
}
// 3.查看是否有下一條語句
var dictArray = [[String : AnyObject]]()
while sqlite3_step(stmt) == SQLITE_ROW {
// 有下一條語句,則將該語句轉成字典,放入數組中
dictArray.append(getRecord(stmt))
}
return dictArray
}
/// 根據'游標指針'獲取一條數據
func getRecord(stmt : COpaquePointer) -> [String : AnyObject] {
// 1.獲取字段個數
let count = sqlite3_column_count(stmt)
var dict = [String : AnyObject]()
for i in 0..<count {
// 2.取出字典對應的key
let cKey = sqlite3_column_name(stmt, i)
guard let key = String(CString: cKey, encoding: NSUTF8StringEncoding) else {
continue
}
// 3.取出字典對應的value
let cValue = UnsafePointer<Int8>(sqlite3_column_text(stmt, i))
guard let value = String(CString: cValue, encoding: NSUTF8StringEncoding) else {
continue
}
// 4.將鍵值放入字典中
dict[key] = value
}
return dict
}
}
在控制器
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
loadPersonData()
}
/// 加載所有的數據
func loadPersonData() {
// 1.獲取查詢語句
let querySQL = "SELECT name, age FROM t_person;"
// 2.執(zhí)行查詢語句
guard let array = SQLiteManager.shareIntance.querySQL(querySQL) else {
return
}
// 3.遍歷數組
var persons : [Person] = [Person]()
for dict in array {
let p = Person(dict: dict)
persons.append(p)
}
}
// MARK:- 對數據庫的操作:添加/修改/刪除
func deleteData() {
// 1.獲取刪除的SQL語句
let deleteSQL = "DELETE FROM t_person WHERE id = 1;"
// 2.執(zhí)行SQL語句
if SQLiteManager.shareIntance.execSQL(deleteSQL) {
print("刪除成功")
}
}
func updateData() {
// 1.獲取修改的SQL語句
let updateSQL = "UPDATE t_person SET name = 'lmj' WHERE id = 1;"
// 2.執(zhí)行SQL語句
if SQLiteManager.shareIntance.execSQL(updateSQL) {
print("修改成功")
}
}
func insertData(name : String, age : Int) {
// 1.創(chuàng)建person對象
let p = Person(dict: ["name" : name, "age" : age])
// 2.將自己插入到數據庫中
p.insertPerson()
}
}