สวัสดีทุกๆคน! ในบทความนี้ เราจะมาเรียนรู้วิธีเพิ่มฐานข้อมูล Realm ให้กับแอป iOS
เราจะสร้างแอป ToDo แบบง่ายๆ เพื่อให้คุณสามารถเรียนรู้วิธีดำเนินการ CRUD (สร้าง อ่าน อัปเดต ลบ) ในฐานข้อมูล Realm
อาณาจักรคืออะไร
Realm เป็นฐานข้อมูลมือถือแบบโอเพ่นซอร์สซึ่งเป็นมิตรกับนักพัฒนาและใช้งานง่าย คุณยังสามารถใช้เป็นทางเลือกแทน Core Data ในแอป iOS
Realm เป็นฐานข้อมูลมือถือข้ามแพลตฟอร์ม ซึ่งหมายความว่าคุณสามารถใช้มันในแอป Android และ iOS ดั้งเดิมและในแอปข้ามแพลตฟอร์มเช่นที่สร้างโดยใช้ React Native รองรับ Objective-C, Swift, Java, Kotlin, C# และ JavaScript
วิธีตั้งค่า Realm ในโครงการ iOS ของคุณ
เราสามารถเพิ่ม Realm ให้กับโปรเจ็กต์ iOS ของเราโดยใช้ SPM (ตัวจัดการแพ็คเกจ Swift), Cocoa Pods หรือ Carthage ในที่นี้ เราจะใช้ Cocoa Pods เพื่อเพิ่ม Realm Pod ให้กับโปรเจ็กต์ iOS ของเรา
- เปิด Xcode และสร้างโปรเจ็กต์แอป iOS เปล่าด้วย UIKit และ Swift โดยไม่ต้องใช้ Core Data
- ปิด Xcode แล้วเปิดเทอร์มินัล นำทางไปยังไดเรกทอรีโครงการของคุณโดยใช้เทอร์มินัล
- เรียกใช้คำสั่งต่อไปนี้เพื่อสร้าง PodFile
pod init
4. ตอนนี้ เมื่อคุณแสดงรายการเนื้อหาของไดเร็กทอรี คุณจะเห็นว่ามี Podfile ใหม่ เปิดไฟล์โดยใช้โปรแกรมแก้ไขข้อความ (ที่นี่ฉันใช้ Vim) แก้ไข Podfile ของคุณเพื่อให้ดูเหมือนกับภาพด้านล่าง บันทึกและปิด Podfile
ตอนนี้เราได้ระบุการพึ่งพาสำหรับ Realm DB แล้ว เราสามารถติดตั้งการพึ่งพาได้โดยใช้คำสั่งด้านล่าง:
pod install
อย่างที่คุณเห็น เราได้เพิ่มการพึ่งพา Realm DB ในโครงการ iOS ของเราเรียบร้อยแล้ว เรียกใช้คำสั่งด้านล่างเพื่อเปิดโครงการของเราใน Xcode
open YOUR_APP_NAME.xcworkspace
หมายเหตุ:หลังจากเปิด Xcode แล้ว อย่าลืมสร้างโครงการโดยกด Command+B
วิธีออกแบบส่วนต่อประสานผู้ใช้ของคุณในขอบเขต
เรากำลังจะทำให้ UI ของแอปของเราเรียบง่าย เปิด Main.storyboard และสร้าง UI อย่างง่ายตามที่แสดงด้านล่างโดยเพิ่มมุมมองตารางด้วยเซลล์ต้นแบบ จากนั้นฝังตัวควบคุมการนำทางและสร้าง IBOutlets สำหรับมุมมองตารางในไฟล์ ViewController.swift:
วิธีสร้างโมเดลข้อมูลในขอบเขต
ในแอป ToDo ของเรา แต่ละงานจะมีชื่องานและรหัสงาน เรากำลังจะสร้างคลาส Model เพื่อเป็นตัวแทนของงาน todo ในตัวนำทางโปรเจ็กต์ คลิกขวาและสร้างไฟล์ Swift ใหม่ และเพิ่มโค้ดด้านล่าง
import Foundation
import RealmSwift
class ToDoTask:Object
{
@objc dynamic var tasknote: String?
@objc dynamic var taskid: String?
}
เธอได้สร้างคลาสโมเดลของเราชื่อ ToDoTask มันสืบทอดคลาส Object ซึ่งเป็นคลาสที่มาพร้อมกับ RealmDB คลาสนี้จัดการกระบวนการภายใต้ประทุนทั้งหมดของการบันทึกข้อมูลที่สร้างโดยใช้คลาสโมเดลนี้ในฐานข้อมูล
เรายังเพิ่มคุณสมบัติสองรายการ:tasknote
ซึ่งเป็นงานที่ต้องทำและ taskid
– ทั้งสองชนิดสตริง @objc
หมายความว่ารหัส Swift ของคุณสามารถมองเห็นได้ใน Objective C และ dynamic
หมายความว่าคุณต้องการใช้ไดนามิกไดนามิก Objective C
ฟังก์ชันพื้นฐานของแอป CRUD
แอพของเราจะทำหน้าที่ดังต่อไปนี้:
- รับข้อมูลจากผู้ใช้โดยใช้ AlertViewController
- เพิ่มอินพุตไปยังฐานข้อมูลและในมุมมองตารางด้วย
- อนุญาตให้ผู้ใช้แก้ไขข้อมูลที่ป้อน
- ปัดเพื่อลบแถวเพื่อลบข้อมูลออกจากทั้งมุมมองตารางและฐานข้อมูล
- ดึงข้อมูลทั้งหมด (ถ้ามี) จากฐานข้อมูลและแสดงในมุมมองตาราง
วิธีรับข้อมูลจากผู้ใช้โดยใช้ AlertViewController
เปิด ViewController.swift
และเพิ่มโค้ดด้านล่างใน ViewDidLoad()
กระบวนการ. และสร้างฟังก์ชันใหม่ที่ชื่อว่า addTask()
และเพิ่มรหัสเพื่อแสดงตัวควบคุมมุมมองการแจ้งเตือนพร้อมกล่องข้อความเพื่อรับข้อมูลจากผู้ใช้
ตอนนี้เมื่อกดปุ่มแถบขวา มันจะเรียก addTask()
ฟังก์ชั่นซึ่งจะแสดง alertviewcontroller
พร้อมช่องข้อความเพื่อรับข้อมูลจากผู้ใช้
navigationItem.rightBarButtonItem = UIBarButtonItem(image: .add, style: .done, target: self, action: #selector(addTask))
navigationController?.navigationBar.prefersLargeTitles = true
title = "RealmDB"
@objc
func addTask()
{
let ac = UIAlertController(title: "Add Note", message: nil, preferredStyle: .alert)
ac.addTextField(configurationHandler: .none)
ac.addAction(UIAlertAction(title: "Add", style: .default, handler: { (UIAlertAction) in
if let text = ac.textFields?.first?.text
{
print(text)
}
}))
ac.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
present(ac, animated: true, completion: nil)
}
วิธีการเพิ่มอินพุตไปยังฐานข้อมูลและมุมมองตาราง
ในการบันทึกข้อมูลลงใน Realm ก่อนอื่นเราต้องได้รับอินสแตนซ์สำหรับ Realm ซึ่งเราสามารถเข้าถึงวิธีการทั้งหมดที่จำเป็นสำหรับการดำเนินการ CRUD สร้างคุณสมบัติของประเภทอาณาจักรใน ViewController.swift
ไฟล์และเริ่มต้นใน viewDidLoad()
วิธีการ
var realmDB: Realm!
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.rightBarButtonItem = UIBarButtonItem(image: .add, style: .done, target: self, action: #selector(addTask))
navigationController?.navigationBar.prefersLargeTitles = true
title = "RealmDB"
realmDB = try! Realm()
}
สร้างอาร์เรย์ว่างประเภท DataModel ของเรา (ToDoTask) อาร์เรย์นี้จะเก็บงานทั้งหมดที่ต้องเพิ่มในมุมมองตารางและฐานข้อมูล
ตอนนี้อยู่ใน addTask()
ฟังก์ชันแก้ไขการปิดการดำเนินการเพิ่มเพื่อให้ได้รับอินพุตของผู้ใช้และสร้าง ID สุ่มสำหรับอินพุตนั้น จากนั้นผนวกเข้ากับอาร์เรย์ของเราและบันทึกลงในฐานข้อมูล
var tasks = [ToDoTask]()
if let text = ac.textFields?.first?.text
{
//Add data to data model array
let t = ToDoTask()
t.taskid = UUID().uuidString
t.tasknote = text
self.tasks.append(t)
//Add data to database
try! self.realmDB.write {
self.realmDB.add(t)
}
//Update table view UI
self.tasktv.reloadData()
}
ตอนนี้เมื่อคุณเรียกใช้แอพ ข้อมูลจะถูกบันทึกไว้ในฐานข้อมูล แต่จะไม่แสดงในมุมมองตารางเนื่องจากเราไม่ได้ใช้วิธีการรับมอบสิทธิ์
ทำให้คลาส ViewController ใช้ UITableViewDelegate
และ UITableViewDataSource
โปรโตคอลและเพิ่มต้นขั้วโปรโตคอล
ตอนนี้อยู่ใน numberOfRowsInSection
วิธีคืนค่าการนับอาร์เรย์งานของเราซึ่งให้จำนวนแถวที่จะเพิ่มในมุมมองตาราง ซึ่งเท่ากับจำนวนองค์ประกอบในอาร์เรย์งาน
func tableView(_ tableView: UITableView, numberOfRowsInSection section:
Int) -> Int
{
return tasks.count;
}
สิ่งต่อไปที่เราต้องทำคือระบุเนื้อหาในแต่ละแถว เราสามารถทำได้โดยใช้ cellForRowAt
วิธีการมอบหมาย ในที่นี้ เราจัดคิวเซลล์โดยใช้ตัวระบุที่เราได้กล่าวถึงในกระดานเรื่องราวและระบุข้อความป้ายกำกับเป็นคุณสมบัติ tasknote ขององค์ประกอบอาร์เรย์งาน
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCell(withIdentifier: "cell")
{
cell.textLabel?.text = tasks[indexPath.row].tasknote
return cell
}
return UITableViewCell()
}
วิธีอนุญาตให้ผู้ใช้แก้ไขข้อมูลที่ป้อน
ตอนนี้เราต้องอนุญาตให้ผู้ใช้แก้ไขงานที่ป้อนและอัปเดตการเปลี่ยนแปลงทั้งในฐานข้อมูลและ UI เราสามารถทำได้โดยใช้วิธีการที่คล้ายกันในการรับข้อมูลจากผู้ใช้ ดำเนินการ didSelectRowAt
วิธีการมอบหมายซึ่งจะถูกเรียกเมื่อผู้ใช้แตะแถวมุมมองตาราง
เพิ่มโค้ดด้านล่างซึ่งแสดง AlertViewController
ด้วยมุมมองข้อความ จากนั้นอัปเดตเนื้อหาของเซลล์ด้วยข้อความที่ป้อน และในขณะเดียวกันก็อัปเดตเนื้อหาในฐานข้อมูล
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let tasktomodify = tasks[indexPath.row]
let ac = UIAlertController(title: "Update task", message: nil, preferredStyle: .alert)
ac.addTextField(configurationHandler: .none)
ac.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (UIAlertAction) in
if let text = ac.textFields?.first?.text
{
if(!text.isEmpty)
{
try! self.realmDB.write({
tasktomodify.tasknote = text
})
self.tasktv.reloadData()
}
}
}))
present(ac, animated: true, completion: nil)
}
วิธีการปัดเพื่อลบแถว &ลบ ข้อมูลจากทั้งมุมมองตารางและฐานข้อมูล
ที่นี่เราจะใช้คุณสมบัติการปัดเพื่อลบในมุมมองตารางของเรา เพื่อให้ผู้ใช้สามารถลบงานของพวกเขาได้ แต่ภายใต้ประทุนเมื่อผู้ใช้ปัดลบแถวมุมมองตาราง ก็ควรลบข้อมูลออกจากฐานข้อมูล อาร์เรย์โมเดลข้อมูล และอัปเดต UI ของมุมมองตาราง
เราสามารถทำได้โดยใช้ commit modifiedStyle วิธีการมอบหมายและเพิ่มรหัสต่อไปนี้:
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete
{
let tasktoDelete = tasks[indexPath.row]
try! realmDB.write({
realmDB.delete(tasktoDelete)
self.tasks.remove(at: indexPath.row)
self.tasktv.deleteRows(at: [indexPath], with: .fade)
})
}
}
วิธีการดึงข้อมูลทั้งหมด (ถ้า ปัจจุบัน) จากฐานข้อมูลและแสดงในมุมมองตาราง
ตอนนี้เรากำลังดำเนินการดำเนินการครั้งสุดท้ายของเรา อ่าน เมื่อใดก็ตามที่ผู้ใช้เปิดแอป แอปควรดึงข้อมูลจากฐานข้อมูล (หากมีข้อมูลอยู่) และแสดงในมุมมองตาราง
เราทำได้โดยสร้างฟังก์ชัน getTodo
ในไฟล์ view controller swift และเพิ่มโค้ดต่อไปนี้เข้าไป:
func getTodos()
{
//Get all the data from the database
let notes = realmDB.objects(ToDoTask.self)
//Clear the model data array to prevent duplicates
self.tasks.removeAll()
/*If the fetched data is not empty then add it to model data array and update the UI */
if(!notes.isEmpty)
{
for n in notes
{
self.tasks.append(n)
}
self.tasktv.reloadData()
}
}
เคล็ดลับโบนัส:วิธีดูเนื้อหาฐานข้อมูลของคุณใน iOS Simulator
ตอนนี้ เมื่อคุณเรียกใช้แอป คุณจะเห็นว่าแอปทำงานตามที่คาดไว้ แต่เราจะตรวจสอบได้อย่างไรว่าข้อมูลถูกเก็บไว้ในฐานข้อมูลจริงหรือไม่? เราสามารถใช้แอปที่เรียกว่า MongoDB Realm Studio ซึ่งเราสามารถดูข้อมูลของเราที่จัดเก็บไว้ในฐานข้อมูล Realm ของเครื่องจำลองได้
โปรดทราบว่าวิธีนี้ใช้ได้เฉพาะเมื่อคุณทดสอบแอปโดยใช้โปรแกรมจำลอง iOS
ใน viewDidLoad()
วิธีเพิ่มบรรทัดโค้ดด้านล่างซึ่งจะพิมพ์เส้นทางไฟล์จริงของแอปของเรา:
print(realmDB.configuration.fileURL!)
ตอนนี้คัดลอกเส้นทางของไฟล์ที่พิมพ์ในคอนโซล เปิดเทอร์มินัลแล้วเรียกใช้คำสั่งต่อไปนี้:
open REALM_FILE_PATH_HERE
ตรวจสอบให้แน่ใจว่าคุณได้ดาวน์โหลด MongoDB Realm Studio จากเบราว์เซอร์ก่อนที่จะรันคำสั่งด้านบน
ตอนนี้จะเปิด RealmFile ของแอปใน MongoDB Realm Studio ซึ่งจะแสดงข้อมูลที่จัดเก็บไว้ในฐานข้อมูลในรูปแบบตาราง
หากคุณเปลี่ยนแปลงข้อมูลโดยแก้ไขหรือลบงาน การเปลี่ยนแปลงจะมีผลในแอป MongoDB Realm Studio:
ยินดีด้วย! คุณได้สร้างแอปง่ายๆ ที่ใช้การดำเนินการ CRUD ในแอป iOS