SQLite trong iOS (Bài 6)

SQLite trong iOS. Như các bạn đã biết SQLite là hệ quản trị cơ sở dữ liệu dành cho thiết bị di động. SQLite còn được gọi là Embedded vì nó có sẵn như là thư viện được liên kết với các ứng dụng. Không có máy chủ chạy ở chế độ nền. Bạn phải xử lý tất cả các hoạt động trong các ứng dụng thông qua các chức năng khác nhau được cung cấp bởi thư viện SQLite.

Trong bài học SQLite trong iOS chúng tôi sẽ hướng dẫn bạn cách tạo một ứng dụng đơn giản sử dụng Swift và FMDB. FMDB viết tắt của Flying Meat Database và chúng ta sẽ dử dụng FMDB để thực hiện các hoạt động trên database như thêm, xem, cập nhật, xoá dữ liệu, …

SQLite trong iOS – Chuẩn bị

Chúng ta có thể sử dụng project hiện có hoặc tạo mới một project dạng Single View Application. Sau khi project được tạo, chúng ta phải thêm thư viện SQLite dynamic library (libsqlite3.0.tbd) vào project với các bước thực hiện như sau (Lưu ý project trong bài học này có tên là SQLiteIniOSTutorial)

Bước 1: Chọn thẻ Build Phases để hiển thị thông tin build -> tại Link Binary With Libraries click chuột vào nút ‘+’

sqlite trong ios 1

Bước 2: Sử dụng chức năng tìm kiếm và tìm libsqlite3.0.tbd -> chọn Add

sqlite trong ios 2

Bước 3: Tải FMDB source code và copy vào project

3.1 Chọn Source Control -> chọn Check Out

sqlite trong ios 3

3.2 Nhập link sau vào Or enter a repository location -> chọn Next

https://github.com/ccgus/fmdb.git

sqlite trong ios 4

3.3 Chọn master -> chọn Next

sqlite trong ios 5

3.4 Chỉ định vị trí lưu source code -> chọn Download

sqlite trong ios 6

Một cửa sổ Xcode project (fmdb project) mới sẽ được hiển thị chứa source code của FMDB như hình bên dưới

sqlite trong ios 7

3.5 Chúng ta sẽ đóng fmdb project và quay lại project SQLiteIniOSTutorial và thực hiện các thao tác sau

3.5.1 Tạo thư mục dùng để chứa FMDB source code

Chuột phải thư mục SQLiteIniOSTutorial -> chọn New Group -> đặt tên fmdb

sqlite trong ios 8

3.5.2 Thêm FMDB source code vào thư mục fmdb

Chuột phải fmdb -> chọn Add Files to “….”

sqlite trong ios 9

Chọn tất cả các tập tin trong thư mục fmdb -> src -> fmdb -> chọn Add

sqlite trong ios 10

Một hộp thoại xuất hiện -> chọn Create Bridging Header

sqlite trong ios 11

3.5.3 Import FMDB.h vào tập tin Bridging-Header.h

sqlite trong ios 19

SQLite trong iOS – Tạo cơ sở dữ liệu và bảng

Khi ứng dụng được khởi động nó cần phải kiểm tra cơ sở dữ liệu đã tồn tại hay chưa. Nếu chưa tồn tại phải tiến hành tạo cơ sở dữ liệu và bảng. Bảng thuộc cơ sở dữ liệu và được sử dụng để lữu trữ thông tin mà người dùng nhập vào. Đoạn code thực thi tác vụ này có thể đặt trong phương thức viewDidLoad của lớp view controller

override func viewDidLoad() {
 super.viewDidLoad()

 let fm = NSFileManager.defaultManager()
 let dd = fm.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
 let fp = dd.URLByAppendingPathComponent("Tên_cơ_sở_dữ_liệu.db")
 let dbPath = fp.path!

 if !fm.fileExistsAtPath(dbPath as String) {
   let db = FMDatabase(path: dbPath as String)
   if db == nil {
     print("Lỗi tạo cơ sở dữ liệu: \(db.lastErrorMessage())")
   }

  if db.open() {
   let sql = "Câu lệnh CREATE TABLE"
   if !db.executeStatements(sql) {
     print("Lỗi tạo bảng: \(db.lastErrorMessage())")
   }
   db.close()
  } else {
    print("Lỗi mở kết nối: \(db.lastErrorMessage())")
  }
 }
}

SQLite trong iOS – Thêm dữ liệu

Trước khi thực hiện thêm dữ liệu, chúng ta phải mở cơ sở dữ liệu và thực thi câu lệnh INSERT để thêm một record vào bảng. Sau khi thực thi thêm dữ liệu, chúng ta cần phải đóng cơ sở dữ liệu. Và để thực thi được câu lệnh INSERT, chúng ta sẽ sử dụng phương thức executeUpdate của FMDatabase. Bên dưới là đoạn code xử lý thêm dữ liệu vào bảng (Lưu ý dbPath được tạo trong phương thức viewDidLoad)

let db = FMDatabase(path: dbPath as String)

if db.open() {
  let sql = "Câu lệnh INSERT"
  let ret = db.executeUpdate(sql, withArgumentsInArray: nil|values)

  if !ret {
    print("Lỗi thêm dữ liệu: \(db.lastErrorMessage())")
  } else {
    print("Thêm dữ liệu thành công")
  }
  // Đóng cơ sở dữ liệu
  db.close()
} else {
  print("Lỗi mở cơ sở dữ liệu: \(db.lastErrorMessage())")
}

Ví dụ thêm dữ liệu vào bảng Employee(id, name, address)

let db = FMDatabase(path: dbPath as String)

if db.open() {
  let sql = "INSERT INTO Employee VALUES (?, ?, ?)"
  let ret = db.executeUpdate(sql, withArgumentsInArray: [1, "GSTH", "HCM"])

  if !ret {
    print("Lỗi thêm dữ liệu: \(db.lastErrorMessage())")
  } else {
    print("Thêm dữ liệu thành công")
  }
  // Đóng cơ sở dữ liệu
  db.close()
} else {
  print("Lỗi mở cơ sở dữ liệu: \(db.lastErrorMessage())")
}

SQLite trong iOS – Xem dữ liệu

Chúng ta sẽ sử dụng câu lệnh SELECT để truy xuất dữ liệu của bảng. Và nếu như phương thức executeUpdate dùng để thực thi câu lệnh INSERT thì phương thức executeQuery dùng để thực thi câu lệnh SELECT và phương thức này sẽ trả về một đối tượng FMResultSet nếu câu lệnh SELECT được thực thi thành công.

let db = FMDatabase(path: dbPath as String)
db.open()

let rs: FMResultSet! = db.executeQuery("Câu lệnh SELECT", withArgumentsInArray: nil|values)

if (rs != nil) {
  // Duyệt kết quả
  while rs.next() {
    // Đọc dữ liệu
    variable = rs.stringForColumn("Tên_cột")
    // ...
  }
}
// Đóng cơ sở dữ liệu
db.close()

Ví dụ xem dữ liệu của bảng Employee(id, name, address)

let db = FMDatabase(path: dbPath as String)
db.open()

let rs: FMResultSet! = db.executeQuery("SELECT * FROM Employee", withArgumentsInArray: nil)

let alEmp = NSMutableArray()
if (rs != nil) {
  // Duyệt kết quả
  while rs.next() {
    // Tạo đối tượng của lớp EmployeeInfo
    let empInfo = EmployeeInfo()

    // Đọc dữ liệu
    id : Int = rs.stringForColumn("id")
    name : String = rs.stringForColumn("name")
    address : String = rs.stringForColumn("address")

    // Gán giá trị cho các thuộc tính
    empInfo.id = id
    empInfo.name = name
    empInfo.address = address

    // Thêm empInfo vào mảng 
    alEmp.addObject(empInfo)
  }
}
// Đóng cơ sở dữ liệu
db.close()

SQLite trong iOS – Cập nhật dữ liệu

Tương tự khi thực thi câu lệnh INSERT chúng ta sẽ sử dụng phương thức executeUpdate của FMDatabase để thực hiện cập nhật dữ liệu. Bên dưới là đoạn code xử lý cập nhật dữ liệu cho bảng

let db = FMDatabase(path: dbPath as String)

if db.open() {
  let sql = "Câu lệnh UPDATE"
  let ret = db.executeUpdate(sql, withArgumentsInArray: nil|values)

  if !ret {
    print("Lỗi cập nhật dữ liệu: \(db.lastErrorMessage())")
  } else {
    print("Cập nhật dữ liệu thành công")
  }
  // Đóng cơ sở dữ liệu
  db.close()
} else {
  print("Lỗi mở cơ sở dữ liệu: \(db.lastErrorMessage())")
}

SQLite trong iOS – Xoá dữ liệu

Tương tự khi thực thi câu lệnh INSERT chúng ta sẽ sử dụng phương thức executeUpdate của FMDatabase để thực hiện xoá dữ liệu. Bên dưới là đoạn code xử lý xoá dữ liệu của bảng

let db = FMDatabase(path: dbPath as String)

if db.open() {
  let sql = "Câu lệnh DELETE"
  let ret = db.executeUpdate(sql, withArgumentsInArray: nil|values)

  if !ret {
    print("Lỗi xoá dữ liệu: \(db.lastErrorMessage())")
  } else {
    print("Xoá dữ liệu thành công")
  }
  // Đóng cơ sở dữ liệu
  db.close()
} else {
  print("Lỗi mở cơ sở dữ liệu: \(db.lastErrorMessage())")
}

SQLite trong iOS – Bài tập thực hành

Bài thực hành số 1: Thiết kế và viết xử lý cho ứng dụng quản lý thông tin nhân viên. Ứng dụng gồm 3 màn hình

Màn hình chính

sqlite trong ios 20

Màn hình Thêm thông tin nhân viên

sqlite trong ios 16

Màn hình Hiển thị thông tin nhân viên

sqlite trong ios 18

Viết xử lý

Khi người dùng chọn nút Thêm nhân viên, màn hình Thêm thông tin nhân viên được hiển thị. Khi người dùng chọn nút Xem thông tin nhân viên, màn hình Hiển thị thông tin nhân viên được hiển thị

Đối với màn hình Thêm thông tin nhân viên, sau khi người dùng nhập thông tin và chọn nút Lưu hoặc Lưu và thoát, thông tin nhân viên được lưu vào SQLite database. Lưu ý các thông tin trên màn hình yêu cầu người dùng phải nhập đầy đủ.

Đối với màn hình Xem thông tin nhân viên, dữ liệu sẽ được đọc từ SQLite database và hiển thị vào UI Table View.

Bài thực hành số 2: Bổ sung chức năng cho màn hình Xem thông tin nhân viên. Cụ thể như hình bên dưới

Bổ sung thứ nhất: Ứng dụng cho phép người dùng tìm kiếm theo tên bằng cách nhập đầy đủ họ và tên hoặc chỉ nhập tên sau đó chọn Hiển thị.

Bổ sung thứ hai: Ứng dụng cho phép người dùng cập nhật hoặc xóa thông tin ngay trên TableView.