Trong bài viết này, chúng ta sẽ áp dụng những nguyên lý cơ bản của Core Data vào trong ứng dụng thực tế qua việc tạo một ứng dụng viết và lưu nhật ký đơn giản với những tính năng như lưu, lấy bài viết và xóa.

Core Data là gì? 

Core Data là một framework,  nó giống như UIKit cung cấp UIButtons, UILabels, UIViews. Core Data cung cấp các giải pháp để quản lý hệ cơ sở dữ liệu của app. Với Core Data bạn có thể lưu, truy xuất và xóa dữ liệu từ bộ nhớ trong của thiết bị. Tuy nhiên, Core Data không phải là hệ cơ sở dữ liệu, nó chỉ là một framework hỗ trợ cho việc quản lý dữ liệu của bạn mà thôi.

Một số định nghĩa chung:

Dưới đây tôi sẽ nói sơ qua về một vài khái niệm chính trong Core Data

  • Entities —  Đối tượng dữ liệu cần lưu, ví dụ: Con Người
  • Attributes — Thuộc tính của dữ liệu ví dụ như Tên, Tuổi, Địa chỉ, Email..

Trước khi bắt đầu thì bạn hãy để ý ở trong Xcode project của mình bạn sẽ thấy một file ở danh sách file bên trái có tên là TenUngDung.xcdatamodelId. 

Nếu bạn chưa nhìn thấy, tức là bạn không tick vào check box "Use Core Data" khi tạo project mới.

Nếu bạn muốn thêm Core Data và ứng dụng sẵn có thì làm theo bước sau: 

  • File -> New -> File
  • Trong mục iOS -> Chọn Core Data -> Data Model
Tham khảo các khóa học lập trình online, onlab, và thực tập lập trình tại TechMaster

Ứng dụng Nhật Ký

Hôm nay chúng ta sẽ cùng nhau viết một ứng dụng Nhật Ký đơn giản, bao gồm những tính năng thêm bài viết vào danh sách. xóa và share.

Giao diện

Với những ứng dụng có thiết kế đơn giản như thế này thì chúng ta nên sử dụng Storyboard để tiết kiệm thời gian và tôi cũng sẽ bỏ qua đoạn khởi tạo các outlet hay kéo thả những item vào nữa. Tôi có tải toàn bộ source code lên GitHub. Các bạn có thể tham khảo và tải về những file cần thiết.

File  .xcdatamodelId là gì?

Đây là nơi mà chúng ta có thể tạo các Entities và thêm Attribute vào cho chúng. Ở dưới cùng bên trái chúng ta ấn chọn Add Entity và đặt tên cho no. Sau đó chúng ta click vào Entity vừa được tạo, và chọn Add Atribute, ở đây tôi set kiểu là String

Tiếp theo chúng ta cần lưu nội dung ở trong UITextView. Mở file ViewController và đảm bảo rằng các outlet đã được kết nối đầy đủ. Để lưu những dữ liệu đã được nhập vào TextView, chúng ta viết đoạn code sau vào trong action block của button.

class addItemViewController: UIViewController, UITextViewDelegate {

@IBOutlet var itemEntryTextView: UITextView?

@IBAction func cancel(_ sender: Any) {
    dismiss(animated: true, completion: nil)
}
@IBAction func saveItem(_ sender: Any) {

        guard let enteredText = itemEntryTextView?.text else {
            return
        }
    
        if enteredText.isEmpty ||  itemEntryTextView?.text == "Type anything..."{
   
        let alert = UIAlertController(title: "Please Type Something", message: "Your entry was left blank.", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "Okay", style: .default) { action in

        })

        self.present(alert, animated: true, completion: nil)

    } else {
        
            guard let entryText = itemEntryTextView?.text else {
                return
            }
       
            let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
            let newEntry = Item(context: context)
            newEntry.name = entryText
            
            (UIApplication.shared.delegate as! AppDelegate).saveContext()
            
            dismiss(animated: true, completion: nil)

    }

}

Trông có vẻ dài và phức tạp, nhưng thực tế thì cơ chế của nó rất dễ hiểu với cú pháp if else đơn giản.

Đầu tiên là kiểm tra xem TextView có trống hay không, nếu trống thì thông báo với người dùng. Đó cũng là lý do vì sao tôi chèn thêm một dòng placeholder bên trong TextView. Tiếp theo đó là truy cập vào các property trong AppDelegate và dùng chúng để lưu trữ dữ liệu. Xcode sẽ tự động tạo ra một đoạn code khi bạn tick chọn Core Data khi tạo project từ đầu. Cuối cùng là chúng ta dismiss View thôi.

Truy xuất Data

Chúng ta sẽ hiển thị những dữ liệu được lưu vào trong TableView, ở đây tôi đặt tên là DisplayTableViewController. Đầu tiên chúng ta truy vấn các property trong AppDelegate và lưu chúng trong một Array.

class DisplayTableViewController: UITableViewController {
    
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    var items: [Item] = []
...
 Tạo một function để khi call sẽ grab dữ liệu
func fetchData() {

    do {
        items = try context.fetch(Item.fetchRequest())
        print(items)
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    } catch {
        print("Couldn't Fetch Data")
    }

}

Thay vì gọi function này trong viewDidLoad, chúng ta nên gọi trong viewWillAppear để dữ liệu update một cách nhanh nhất. 

override func viewWillAppear(_ animated: Bool) {
    fetchData()
}

Tùy chỉnh UITableView

Thao tác này tương đối là đơn giản nếu như bạn đã quen với UITableView

class DisplayTableViewController: UITableViewController {
...
}

extension DisplayTableViewController {
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    }    
}

Ở đây tôi đặt những đoạn code xử lý vào trong extension để cấu trúc file rõ ràng, riêng biệt và dễ nhìn hơn.

Ở func cellForRow chúng ta lấy từng dữ liệu và đổ vào trong từng cell tương ứng:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as UITableViewCell

    cell.textLabel?.text = items[indexPath.row].name

    return cell
}

Còn tại func numberOfRows chúng ta cần trả về số phần tử của array, tương ứng với số cell trên TableView.

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return items.count

}

Build và chạy ứng dụng ở trên simulator, và chúng ta cơ bản đã có một ứng dụng Nhật Ký đơn giản.

Ở Phần 2, chúng ta sẽ thêm các tính năng xóa bài viết với hiệu ứng trượt để xóa hay share. tạo dynamic cell heights, filter để hiển thị bài viết mới nhất lên đầu đồng thời thêm một vài thủ thuật UI đơn giản nữa.

Khóa học lập trình di động tại Techmaster:

Để cài đặt MacOSX lên phần cứng không phải Apple liên hệ chuyên gia cài Hackintosh:

  • Nguyễn Minh Sơn: 01287065634
  • Huỳnh Minh Sơn: 0936225565
  • Website: caidatmacos.com