iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 27
0
Software Development

30天Swift入門學習系列 第 27

iOS App 實作(19) SQLite(part 3)


Description:
前兩篇講解了 SQLite 語法並將之實作成 Swift code 後,本篇為整個 App 的實作也是這系列的最後一篇。
此 demo 透過兩個 TextField 來讓使用者輸入名字和身高並將輸入的資料用 TableView 呈現,點選每個欄位可以更新資料或是刪除。


Component:

  1. UINavigationController
  2. TextField
  3. UIButton

Highlight function:
建立及開啟名為 sqlite3.db 之資料庫檔案,裡面有包含一張名為 UserInfoTable 之表單。該表單內含三個 columns(id, name, height)。

let dbTableName: String = "UserInfoTable"
...
override func viewDidLoad() {
  ...
  let destinationUrl = getDirectoryPath().appendingPathComponent("sqlite3.db")
  db = Sqlite(path: destinationUrl.absoluteString)
  if db != nil {
    let dbStatus = db!.createTable(dbTableName,
                                   columnsInfo: ["id integer primary key autoincrement",                                                  "name text",                                                                            "height double"])
  }
  ...
  
  func getDirectoryPath() -> URL {
    // create document folder url
    let fileDirectoryURL = FileManager.default.urls(for: .documentDirectory,
                                                    in: .userDomainMask).first!
    return fileDirectoryURL
  }
  ...
}

在將資料讀取並顯示在 TableView 中時由於資料庫表單內不只含一筆資料,須透過回傳之 statement 來判斷是否是該 SQL 語法執行後回傳的最後一筆資料。而將每筆資料中不同 column 取出的方法是透過呼叫 sqlite3_column()。

func fetchData(offset: Int) {
  let statement = db!.fetch("UserInfoTable", cond: nil, sortBy: nil, offset: offset)
  var fetchResult: [UserInfo] = [UserInfo]()
    
  while sqlite3_step(statement) == SQLITE_ROW {
    let id = sqlite3_column_int(statement, 0)
    let name = String(cString: sqlite3_column_text(statement, 1))
    let height = sqlite3_column_double(statement, 2)
      
    fetchResult.append(UserInfo.init(id: id, name: name, height: height))
  }
  ...
}  

Reference:
Source code on Github


上一篇
iOS App 實作(19) SQLite(part 2)
下一篇
iOS App 實作(20) Face Detection
系列文
30天Swift入門學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言