Realm – a mobile database and a replacement for SQLite & Core Data

AUTHOR: viva


Sau khi Apple công bố iOS 8 với những cải tiến về performance và những tính năng mang tính đột phá như: Health, Handoff, Airdrop…tại WWDC 2014, thì ngay sau đó một tháng, 7/2014, một cross-platform database được ra mắt dành riêng cho các ứng dụng mobile với cách viết code ngắn gọn, trong sáng và vô cùng mạnh mẽ. Đó là Realm(https://twitter.com/realm).

Realm

Realm(https://realm.io/) được phát triển bởi một công ty chuyên hỗ trợ các dự án startup trong việc thu hút vốn đầu tư từ các investors trên toàn thế giới. Công ty có trụ sở chính tại San Francisco, bạn có thể muốn tìm hiểu thêm về họ: http://www.ycombinator.com/

Quay trở lại một chút thời điểm khi chưa có Realm. Khi các bạn LTV mobile xây dựng một ứng dụng mobile có sử dụng đến database lưu trữ data sẽ cần lựa chọn một database backend cụ thể như CoreData (iOS) hoặc SQLite(iOS, Android). Tùy vào từng dự án cụ thể mà một team có thể lựa chọn các vendor khác nhau, giả dụ như team nhận được một dự án về phát triển một ứng dụng cho phép người dùng tìm điểm sửa xe gần nhất với giả rẻ nhất, chất lượng tốt nhất (tạm gọi tên ứng dụng là Viva). Ứng dụng được đặt hàng phát triển trên 2 nền tảng chính là Android và iOS, lại phân tích yêu cầu bài toán một chút, với ứng dụng kiểu này thì chắc chắn sẽ cần lưu trữ lại data của các điểm sửa xe trong một phạm vi nào đó quanh vị trí của người dùng trong trường hợp không có 3G or wifi (offline mode). Điều này có nghĩa team cần đưa ra quyết định là sẽ xử dụng vendor nào (CoreData or SQLite) ? Thông thường sự lựa chọn tối ưu nhất sẽ là SQLite. Lý do:

  • Support trên 2 nền tảng iOS và Android.
  • Quen thuộc cho LTV thông qua các câu lệnh sql statements.
  • Có các wrappers tiện ích như FMDB (https://github.com/ccgus/fmdb).

Với các ưu điểm trên, lựa chọn SQLite thật dễ dàng. Tuy nhiên cũng có các nhược điểm tồn tại không chỉ ở SQLite, mà còn ở CoreData. Do bài viết này tập trung vào phân tích về Realm nên các bạn có thể tìm hiểu thêm ưu nhược điểm của 2 vendor này thông qua slide về chúng tại đây: https://drive.google.com/file/d/0ByBQxPjuuB5pYkcwZk9uYzVsWEk/view?pli=1

Vậy vì sao lại chọn Realm(https://www.youtube.com/watch?v=hNDNXECD84c) ?? Đây là lý do:

  • Realm cũng hỗ trợ các nền tảng mobile, có cả support cho Java.
  • Realm nhỏ gọn, vô cùng dễ dàng để tích hợp vào project.
  • Realm tỏ ra vượt trội về performance trong việc insert and fetch hàng trăm ngàn record.
  • Realm tối ưu các dòng code cho một tác vụ nào đó với database local.

Tóm lại, đây là tất cả những gì họ nói về Realm:

Screen Shot 2015-11-20 at 10.59.08 PM

Đến đây có thể các bạn sẽ nghi ngờ về độ chính xác về các đặc điểm ưu việt của Realm ? Tôi sẽ đưa thêm các bản so sánh về performance và code demo để xác thực một số điều về Realm:

Screen Shot 2015-11-20 at 11.03.59 PM

Screen Shot 2015-11-20 at 11.04.12 PM

Như các bạn có thể thấy, với các chỉ số đo đạc trên cùng một thiết bị phần cứng, cùng một OS, Realm luôn bỏ xa phần còn lại. Còn về việc tinh gọn trong cách viết code ư ??

Hãy xem cách mà CoreData cung cấp để search các điểm sửa xe và sắp xếp theo Alphabet:

Và đây là những dòng lệnh khi làm việc với Realm:

Cooooool lah? 

Để bắt đầu làm quen với Realm, trong blog này chúng ta sẽ xây dựng một ứng dụng tìm địa điểm sửa xe gần nhất. Chúng ta sẽ hoàn thành một trong những function quan trọng là hiển thị tất cả các điểm sửa xe gần với người dùng nhất, tất cả các location sẽ được hiển thị trên MapView.

Bạn sẽ cần tạo một project iOS bằng việc tạo single view controller project. Sau đó bạn sẽ thêm một MapView vào view controller đó, bạn cũng sẽ cần import MapKit.framework, như hình:

Screen Shot 2015-11-21 at 12.01.19 AM

Chú ý: Từ iOS 8 or later, việc truy cập vào các tài nguyên trong các ứng dụng mặc định như Calendar, Map… của iOS sẽ cần được authenticate. Để làm việc này bạn cần khai báo trong info.plist như sau:

Screen Shot 2015-11-21 at 12.05.13 AM

Bạn nhìn thấy NSLocationWhenInUseUsageDescription chứ ? Việc này cần thiết để hiện thị content của confirm thông báo có cho phép người dùng trui cập hay không. Bạn tiếp tục khai báo một biến kiểu CLLocationManager sau vào trong AppDelegate.swift:

Sử dụng biến này làm nhiệm vụ authenticate với hệ thống bằng 2 dòng lệnh sau:

Bạn hãy thử Run app và xem hiển thị:

Screen Shot 2015-11-21 at 12.11.10 AM

Tiếp theo, hãy tích hợp Realm vào project. Sẽ có 3 cách để bạn sử dụng thư viện Realm trong project:

Blog này tôi sẽ dùng CocoaPods(tham khảo cách cào đặt:https://cocoapods.org/) để get Realm repo.

Bạn cần có một Podfile, sau đó thêm 2 câu lệnh như sau:

Screen Shot 2015-11-21 at 12.21.42 AM

Sau khi thêm xong các bạn Save lại, việc này đảm bảo CocoaPods sẽ get đúng Realm repo. Việc tiếp theo là bạn sẽ sử dụng Terminal để thực thi việc get Realm repo:

  • Trỏ đến thư mục chưa Podfile và xcodeproj
  • Sử dụng câu lệnh pod install để thực thi

Screen Shot 2015-11-21 at 12.22.39 AM

Screen Shot 2015-11-21 at 12.25.51 AM

Khi đã hoàn tất việc get Realm repo về bạn sẽ mở project bằng cách chọn Viva.xcworkspace thay vì Viva.xcodeproj như trước. Hãy thử Build -> Run lại project để chắc là mọi thứ vẫn ổn và bạn sẽ thấy chúng ta đã có thêm một sub-proj là Pods với RealmSwift folder ngay phía dưới:

Screen Shot 2015-11-21 at 12.35.55 AM

Trong file ViewController.swift bạn sẽ viết thêm một extension ViewController – extension này sẽ có nhiệm vụ thao tác với database.

Tôi sẽ tạo một private function dung để tạo ra new database file có tên là Viva.realm trong Documents folder.

Thực hiện xong dòng code, bạn sẽ cần Run project một lần nữa và vào thư mục Documents để xem:

Screen Shot 2015-11-21 at 1.31.31 AM

Tiếp sau đó tôi sẽ tạo một table có tên Supporter trên Viva.realm, bạn dễ dàng thực hiện như sau:

Bạn có thể print object ra để kiểm tra:

Hoặc cách hay hơn là dùng Realm Browser, Realm cung cấp một ứng dụng cho phép người dùng có thể download trực tiếp trên AppStore để cài trên MacOS:

Screen Shot 2015-11-21 at 1.36.41 AM

Bạn có thể thấy Realm Browser trên hình ảnh, click mở app và trỏ đến Viva.realm database:

Screen Shot 2015-11-21 at 1.39.39 AM

Bạn thấy rõ chứ, db của bạn sẽ được view lên như vậy với Realm Browser.

Giả sử tôi sẽ lấy địa điểm sửa xe thứ nhất:

Sau đó sẽ fill lên MapView:

Bạn sẽ thấy kết quả như sau (tôi đang giả sử my location là Hong Kong ):

Simulator Screen Shot Nov 21, 2015, 1.51.47 AM

Bạn sẽ muốn hoàn thiện app này chứ ?? Thêm nhiều điểm sửa xe, thêm các chức năng filter theo loại xe, rating của khách hàng, thêm các action để đánh giá service của từng điểm sửa xe…bla…bla. Hãy hoàn thành nó với anh bạn mới Realm thôi nào.

calm-the-fuck-down-bro.jpg

Để tìm hiểu nhiều hơn về Realm, tôi khuyến khích các bạn ngâm cứu documentation tại đây: Realm Documentation for Swift. Rất nhiều điều thú vị với Realm đang chờ đợi bạn.

Cuối cùng, đây là project demo: Realm Demo

Have a nice weekend. Bye!

Post Views: 900

Comments

comments