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(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:
Đế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:
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:
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:
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ị: