CHƯƠNG 1: CƠ SỞ LÝ THUYẾT nhanh chóng trong việc xây dựng database, Google Firebase còn giúp ta đơn giản hóa quá trình đăng kí và đăng nhập vào ứng dụng bằng các sử dụng hệ thống xác thực do chính Firebase cung cấp. Bảo mật Triển khai ứng dụng nhanh Firebase hoạt động dựa trên nền tảng cloud và thực hiện kết nối thông qua giao thức bảo mật SSL, chính vì vậy bạn sẽ bớt lo lắng rất nhiều về việc bảo mật của dữ liệu cũng như đường truyền giữa client và server. Không chỉ có vậy, việc cho phép phân quyền người dùng database bằng cú pháp javascipt cũng nâng cao hơn nhiều độ bảo mật cho ứng dụng của bạn, bởi chỉ những user mà bạn cho phép mới có thể có quyền chỉnh sửa cơ sở dữ liệu. Tính linh hoạt và khả năng mở rộng Sử dụng Firebase sẽ giúp bạn dễ dàng hơn rất nhiều mỗi khi cần nâng cấp hay mở rộng dịch vụ.
Ngoài ra firebase còn cho phép bạn tự xây dựng server của riêng mình để bạn có thể thuận tiện hơn trong quá trình quản lý. Việc Firebase sử dụng NoSQL, giúp cho database của bạn sẽ không bị bó buộc trong các bảng và các trường mà bạn có thể tùy ý xây dựng database theo cấu trúc của riêng bạn Sự ổn định Firebase hoạt động dựa trên nền tảng cloud đến từ Google vì vậy hầu như bạn không bao giờ phải lo lắng về việc sập server, tấn công mạng như DDOS, tốc độ kết nối lúc nhanh lúc chậm, … nữa, bởi đơn giản là Firebase hoạt động trên hệ thống server của Google. Hơn nữa nhờ hoạt động trên nền tảng Cloud nên việc nâng cấp, bảo trì server cũng diễn ra rất đơn giản mà không cần phải dừng server để nâng cấp như truyền thống. Giá thành Google Firebase có rất nhiều gói dịch vụ với các mức dung lượng lưu trữ cũng như băng thông khác nhau với mức giá dao động từ Free đến $1500 đủ để đáp ứng được nhu cầu của tất cả các đối tượng.
Chính vì vậy bạn có thể lựa chọn gói dịch vụ phù hợp nhất với nhu cầu của mình. Điều này giúp bạn tới ưu hóa được vốn đầu tư và vận hành của mình tùy theo số lượng người sử dụng. 7 do an CHƯƠNG 1: CƠ SỞ LÝ THUYẾT 1.2 Room Room là một Persistence Library được google giới thiệu trong sự kiện google I/O năm 2017, nó là một abstract layer cung cấp cách thức truy cập thao tác với dữ liệu trong SQLite. Các ứng dụng sử dụng một lượng lớn dữ liệu có cấu trúc có thể hưởng lợi lớn từ việc lưu dữ liệu trên local thông qua Room.
Trường hợp thường gặp nhất là chỉ cache những dữ liệu có liên quan, như vậy thì khi thiết bị không có kết nối internet thì user vẫn có thể truy cập data đấy khi đang offline. Mọi dữ liệu được phát sinh hay thay đổi do user sau đó sẽ được đồng bộ với server khi họ online trở lại. Các thành phần chính trong Room: Hình 1.1 Các thành phần chính trong Room 1.1 Entity Component này đại diện cho một class chứa một row của database. Với mỗi một entity thì một database table sẽ được tạo để giữ các items tương ứng, đồng thời nên tham chiếu lớp enity thông qua mảng entities trong class Database.
Mỗi một trường của entity sẽ được pesist trong database trừ trường hợp bị chú thích là @Ignore. Entity Vơi mỗi Object được định nghĩa với anotation @Entity Room sẽ tạo một table cho đối tượng này trong database với name là tableName được chú thích. Room sẽ tạo các cột tương ứng với số field được khai báo trong object. Nếu không muốn lưu trữ bạn có thể sử dụng anotation @Ignore.
Bạn có thể custom lại tên của cột thông qua anotaion @ColumnInfo (name = "column name"). 8 do an CHƯƠNG 1: CƠ SỞ LÝ THUYẾT Primary key Mỗi Object phải xác định ít nhất 1 trường làm khóa chính. Ngay cả khi chỉ có 1 trường, vẫn cần chú thích trường này bằng chú thích @PrimaryKey. Ngoài ra, nếu muốn gán ID tự động cho các thực thể, có thể đặt thuộc tính autoGenerate vào @PrimaryKey.
Ví dụ: @PrimaryKey (autoGenerate = true) private int mId; Indices and uniqueness Trường hợp các bạn muốn đánh index cho một số trường trong database để tăng tốc độ truy vấn các bạn có thể sử dụng như sau: Ví dụ: @Entity (indices = {@Index (value = {"first_name", "last_name"}}) Một số trường hợp các bạn có thể muốn một số trường là duy nhất trong database ví dụ first_name và last_name không thể có bản ghi nào trùng nhau các bạn có thể thêm unique như sau: @Entity (indices = {@Index (value = {"first_name", "last_name"}, unique = true)}) Nested objects Trong một số trường hợp các bạn tạo ra object với các nested object, các bạn không có nhu cầu lưu chúng thành 1 bảng riêng mà đơn giản chỉ giống như 1 column bình thường các bạn có thể sử dụng anotaion @Embedded cho chúng giống như ví dụ cho Place trong object User dưới đây: Ví dụ: @Embedded private Place mPlace; 1. DAO là thành phần chính của Room chịu trách nhiệm trong việc định nghĩa các phương thức truy cập CSDL. Các class được chú thích với @Database phải chứa một phương thức trừu tượng có số lượng đối số truyền vào là 0 và đối tượng trả về là đối tượng của lớp được chú thích bởi @Dao.3 Database Có thể dùng componenet này để tạo database holder. Annotation sẽ cung cấp danh sách các thực thể và nội dung class sẽ định nghĩa danh sách các DAO của CSDL, 9 do an CHƯƠNG 1: CƠ SỞ LÝ THUYẾT nó cũng là điểm truy cập chính cho các kết nối phía dưới.
Annotated class nên để là lớp abstract extends RoomDatabase, vì tại thời điểm runtime thì dev có thể nhận được một instance của nó bằng cách gọi Room.3 MÃ NGUỒN MỞ RXJAVA & RETROFIT 1.1 RxJava - RxJava là thư viện mã nguồn mở implement ReactiveX trên Java. Có 2 lớp chính là Observable và Subscriber. - Observable là một lớp đưa ra dòng dữ liệu hoặc sự kiện (event). Flow của Observable là đưa ra một hoặc nhiều các items, sau đó gọi kết thúc thành công hoặc lỗi.
- Subscriber lắng nghe flow, thực thi các hành động trên dòng dữ liệu hoặc sự kiện được đưa ra bởi Observable. - Một Observable có thể có một hoặc nhiều Subcriber Mỗi item được đưa ra bởi Observable, nó sẽ được bắt bởi phương thức Subcriber. - Mỗi Observable kết thúc sẽ gọi phương thức Subscriber.onCompleted() hoặc Subcriber.2 Retrofit - Nói một cách dễ hiểu Retrofit là một thư viện giúp phân tích cú pháp phản hồi API dễ dàng và được xử lý tốt hơn để sử dụng trong ứng dụng. Theo định nghĩa của Square (nhà phát triển Retrofit): A type-safe HTTP client for Android and Java - Retrofit là một type-safe HTTP client cho Java và Android được phát triển bởi Square.
Retrofit giúp dễ dàng kết nối đến một dịch vụ REST trên web bằng cách chyển đổi API thành Java Interface. - Type-safe một ví dụ đơn giản là trình biên dịch sẽ xác nhận hợp lệ các kiểu dữ liệu trong khi biên dịch và ném một lỗi nếu bạn cố gán kiểu sai cho một biến. - Thư viện mạnh mẽ này giúp bạn dễ dàng xử lý dữ liệu JSON hoặc XML sau đó phân tích cú pháp thành Plain Old Java Objects (POJOs). Tất cả các yêu cầu GET, POST, PUT, PATCH, và DELETE đều có thể được thực thi.
10 do an CHƯƠNG 1: CƠ SỞ LÝ THUYẾT 1.1 Retrofit Annotations - Sử dụng Annotations để mô tả yêu cầu HTTP: - Hỗ trợ tham số URL và tham số truy vấn - Chuyển đổi đối tượng để yêu cầu nội dung - Multipart request body và file upload.1 Request Method - Mỗi phương thức phải có Annotation HTTP cung cấp request method và URL. Có 5 loại Annotation được tích hợp sẵn: @GET, @POST, @PUT, @DELETE và @HEAD. - Có thể chỉ định tham số truy vấn trong URL: @GET("users/list?sort=desc") 1.2 Url Manipulation - URL request có thể được cập nhật tự động bằng cách sử dụng các khối thay thế và tham số trên phương thức. - Chúng ta có thể nối thêm paramater vào sau URL bằng cách sử dụng @Query @GET("group/{id}/users") Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort); 1.
- Một đối tượng có thể được chỉ định để sử dụng làm phần thân yêu cầu HTTP với Annotation @Body. @POST("users/new") Call<User> createUser (@Body User user); - Đối tượng cũng sẽ được chuyển đổi bằng cách sử dụng Converter được chỉ định trên instance của Retrofit. Nếu không có Converter nào được thêm vào, chỉ có thể sử dụng RequestBody.4 OPENWEAHTERMAP & GOOGLE APIS 1.1 OpenWeatherMap API API này cung cấp dịch vụ dữ liệu thời tiết và dự báo miễn phí, thích hợp cho bất kỳ dịch vụ bản đồ như các ứng dụng web và điện thoại thông minh. Ý tưởng được lấy cảm hứng từ OpenStreetMap và Wikipedia nhằm cung cấp thông tin miễn phí và sẵn có cho mọi người.
11 do an CHƯƠNG 1: CƠ SỞ LÝ THUYẾT OpenWeatherMap cung cấp nhiều dữ liệu thời tiết như bản đồ thời tiết hiện tại, dự báo tuần, lượng mưa, gió, mây, dữ liệu từ các trạm thời tiết và nhiều thứ khác. Dữ liệu thời tiết được nhận từ các dịch vụ phát sóng khí tượng toàn cầu và hơn 40.000 trạm khí tượng. Bạn có thể nhận được bất kỳ dữ liệu thời tiết nào cho ứng dụng của bạn bằng cách sử dụng chuỗi JSON hoặc XML. Các tính năng nổi bật mà API cung cấp: 1.1 Dữ liệu thời tiết hiện tại (Current Weather Data) Truy cập dữ liệu thời tiết hiện tại cho bất kỳ vị trí nào bao gồm hơn 200.000 thành phố, Thời tiết hiện tại thường xuyên được cập nhật dựa trên các mô hình và dữ liệu toàn cầu từ hơn 40.000 trạm thời tiết.
Dữ liệu có sẵn ở định dạng JSON, XML hoặc HTML. Có sẵn ở bản miễn phí và tất cả các tài khoản trả phí khác.2 Dự báo thời tiết 5 ngày tới mỗi 3 giờ Dự báo 5 ngày có sẵn tại bất kỳ địa điểm hoặc thành phố nào. Dự báo 5 ngày bao gồm dữ liệu thời tiết cứ sau 3 giờ. Dự báo có sẵn trong JSON và XML.
Có sẵn ở bản miễn phí và tất cả các tài khoản trả phí khác.3 Dự báo 16 ngày tới mỗi ngày Dự báo 16 ngày có sẵn tại bất kỳ địa điểm hoặc thành phố nào. Dự báo 16 ngày bao gồm thời tiết hàng ngày và có sẵn trong JSON và XML.4 Dữ liệu lịch sử thời tiết API OpenWeatherMap cung cấp dữ liệu lịch sử thời tiết cho hơn 37. Dữ liệu lịch sử trong 1 tháng trước đó có sẵn trong tài khoản Starter, cho 1 năm trước trong tài khoản Medium và trong 5 năm trong History Bulk.5 Trạm thời tiết (Weather Stations) API để quản lý các trạm thời tiết cá nhân của bạn. Tạo trạm và các phép đo đạc.
Nhận các phép đo tổng hợp từ trạm. Có sẵn miễn phí và tất cả các tài khoản trả phí khác.