這是Swift 中使用 SQLite系列文章的第二篇,本文主要介紹一下如何創建數據表,首先提示一下:
- 如果是第一次運行,打開數據庫之後,只能得到一個空的數據,沒有任何的數據表
- 爲了讓數據庫正常使用,在第一次打開數據庫後,需要執行
創表
操作
- 注意:創表操作本質上是通過執行
SQL
語句實現的
代碼實現
- 執行
SQL
語句函數
/// 執行 SQL
///
/// - parameter sql: SQL
///
/// - returns: 是否成功
func execSQL(sql: String) -> Bool {
/**
參數
1. 數據庫句柄
2. 要執行的 SQL 語句
3. 執行完成後的回調,通常爲 nil
4. 回調函數第一個參數的地址,通常爲 nil
5. 錯誤信息地址,通常爲 nil
*/
return sqlite3_exec(db, sql, nil, nil, nil) == SQLITE_OK
}
通過 SQL 語句創建數據表
- 通過 SQL 語句直接創建數據表
/// 創建數據表
///
/// - returns: 是否成功
private func createTable() -> Bool {
// 1. 準備 SQL
let sql = "CREATE TABLE IF NOT EXISTS 'T_Person' ( \n" +
"'id' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, \n" +
"'name' TEXT, \n" +
"'age' INTEGER, \n" +
"'height' REAL \n" +
");"
// 2. 返回執行 SQL 的結果
return execSQL(sql)
}
- 調整
openDB
函數
if createTable() {
print("創建數據表成功")
} else {
print("創建數據表失敗")
}
小結
- 創表
SQL
可以從Navicat
中粘貼,然後做一些處理- 將
"
替換成'
- 在每一行後面增加一個
\n
防止字符串拼接因爲缺少空格造成SQL
語句錯誤 - 在
表名
前添加IF NOT EXISTS
防止因爲數據表存在出現錯誤
- 將
通過 SQL 文件直接創表
- 在 Xcode 中建立
db.sql
文件 - 將 Navicat 中的 DDL 創表文件粘貼到 db.sql 中
- 每個表名前添加
IF NOT EXISTS
防止因爲數據表存在出現錯誤 - 每段 SQL 末尾添加
;
- 使用
-- 描述信息
增加數據表備註
- 每個表名前添加
-- 創建個人信息表
CREATE TABLE IF NOT EXISTS "T_Person" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" TEXT,
"age" INTEGER,
"height" REAL
);
-- 創建圖書表
CREATE TABLE IF NOT EXISTS "T_Books" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" TEXT
);
- 修改
createTable
函數
/// 創建數據表 - 從 bundle 加載並執行 db.sql
///
/// - returns: 是否成功
private func createTable() -> Bool {
// 1. 準備 SQL
let path = NSBundle.mainBundle().pathForResource("db.sql", ofType: nil)!
guard let sql = try? NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding) else {
print("加載 SQL 失敗")
return false
}
// 2. 執行 SQL
return execSQL(sql as String)
}
小結
- 通過 sql 腳本創建數據表的方式靈活性更大,被廣泛應用在商業應用中
- 如果要保護數據安全,可以對 sql 腳本進行一些簡單的加密處理
base 64 簡單加密
- 在終端輸入以下命令
$ base64 db.sql -o db64.txt
- 將 db64.txt 拖拽到項目中
- 新建以下函數,先解碼再執行
/// 加載 base64 編碼後的 SQL
///
/// 提示:
/// - BASE64 編碼
/// $ base64 db.sql -o db64.txt
/// - BASE64 解碼
/// $ base64 db64.txt -D -o db.sql
/// - returns: 是否成功
private func createTable3() -> Bool {
// 1. 準備 SQL
let path = NSBundle.mainBundle().pathForResource("db64.txt", ofType: nil)!
let base64 = try! String(contentsOfFile: path)
let data = NSData(base64EncodedString: base64, options: [.IgnoreUnknownCharacters])!
// base64 解碼
let sql = NSString(data: data, encoding: NSUTF8StringEncoding)! as String
// 2. 執行 SQL
return execSQL(sql)
}