Mẫu kho lưu trữ

1. Trước khi bắt đầu

Giới thiệu

Trong lớp học lập trình này, bạn sẽ cải thiện trải nghiệm người dùng cho một ứng dụng bằng cách sử dụng chức năng lưu vào bộ nhớ đệm khi không có kết nối mạng. Nhiều ứng dụng phụ thuộc vào dữ liệu từ mạng. Nếu ứng dụng của bạn tìm nạp dữ liệu từ máy chủ mỗi khi chạy và người dùng thấy màn hình tải dữ liệu, nghĩa là ứng dụng có trải nghiệm người dùng chưa tốt. Khi đó, người dùng có thể gỡ cài đặt ứng dụng.

Khi chạy một ứng dụng, người dùng kỳ vọng ứng dụng đó sẽ nhanh chóng hiển thị dữ liệu. Bạn có thể thực hiện điều này bằng cách triển khai chức năng lưu vào bộ nhớ đệm khi không có kết nối mạng. Lưu vào bộ nhớ đệm khi không có kết nối mạng nghĩa là ứng dụng lưu dữ liệu đã tìm nạp từ mạng vào bộ nhớ của thiết bị, giúp truy cập dữ liệu nhanh hơn.

Vì ứng dụng có thể nhận dữ liệu từ mạng và lưu các kết quả đã tải xuống trước đó vào bộ nhớ đệm ngoại tuyến nên bạn cần có một cách để ứng dụng sắp xếp nhiều nguồn dữ liệu này. Bạn sẽ thực hiện việc này bằng cách triển khai một lớp kho lưu trữ. Lớp này sẽ trở thành nguồn tin cậy duy nhất cho dữ liệu của ứng dụng và tách nguồn dữ liệu (mạng, bộ nhớ đệm và các nguồn khác) khỏi mô hình chế độ xem.

Kiến thức bạn cần có

Bạn cần thông thạo:

Kiến thức bạn sẽ học được

  • Cách triển khai kho lưu trữ để tách lớp dữ liệu của một ứng dụng khỏi phần còn lại của ứng dụng.
  • Cách tải dữ liệu được lưu vào bộ nhớ đệm bằng kho lưu trữ.

Bạn sẽ thực hiện

  • Dùng một kho lưu trữ để tách lớp dữ liệu và tích hợp lớp kho lưu trữ với ViewModel.
  • Hiển thị dữ liệu từ bộ nhớ đệm ngoại tuyến.

2. Mã nguồn ban đầu

Tải mã nguồn dự án xuống

Lưu ý tên thư mục là RepositoryPattern-Starter. Hãy chọn thư mục này khi bạn mở dự án trong Android Studio.

Để lấy mã nguồn cho lớp học lập trình này và mở đoạn mã đó trong Android Studio, hãy thực hiện các bước sau.

Lấy mã

  1. Nhấp vào URL được cung cấp. Thao tác này sẽ mở trang GitHub của dự án trong một trình duyệt.
  2. Kiểm tra để đảm bảo tên nhánh khớp với tên nhánh được chỉ định trong lớp học lập trình. Ví dụ: trong ảnh chụp màn hình sau đây, tên nhánh là main (chính).

8cf29fa81a862adb.png

  1. Trên trang GitHub cho dự án này, hãy nhấp vào nút Code (Mã), một cửa sổ bật lên sẽ hiện ra.

1debcf330fd04c7b.png

  1. Trong cửa sổ bật lên, nhấp vào nút Download ZIP (Tải tệp ZIP xuống) để lưu dự án vào máy tính. Chờ quá trình tải xuống hoàn tất.
  2. Xác định vị trí của tệp trên máy tính (thường nằm trong thư mục Downloads (Tệp đã tải xuống)).
  3. Nhấp đúp vào tệp ZIP để giải nén. Thao tác này sẽ tạo một thư mục mới chứa các tệp dự án.

Mở dự án trong Android Studio

  1. Khởi động Android Studio.
  2. Trong cửa sổ Welcome to Android Studio (Chào mừng bạn đến với Android Studio), hãy nhấp vào Open (Mở).

d8e9dbdeafe9038a.png

Lưu ý: Nếu Android Studio đã mở thì chuyển sang chọn tuỳ chọn File (Tệp) > Open (Mở) trong trình đơn.

8d1fda7396afe8e5.png

  1. Trong trình duyệt tệp, hãy chuyển đến vị trí của thư mục dự án chưa giải nén (thường nằm trong thư mục Downloads (Tệp đã tải xuống)).
  2. Nhấp đúp vào thư mục dự án đó.
  3. Chờ Android Studio mở dự án.
  4. Nhấp vào nút Run (Chạy) 8de56cba7583251f.png để tạo và chạy ứng dụng nhằm đảm bảo rằng ứng dụng được xây dựng như mong đợi.

3. Tổng quan về ứng dụng ban đầu

Ứng dụng DevBytes cung cấp danh sách các video DevBytes từ Kênh YouTube dành cho nhà phát triển Android ở chế độ RecyclerView. Tại đây, người dùng có thể nhấp để mở đường liên kết đến video.

9757e53b89d2de7c.png

Mặc dù mã khởi đầu có thể hoạt động bình thường, nhưng đoạn mã này có một lỗi nghiêm trọng có thể ảnh hưởng tiêu cực đến trải nghiệm người dùng. Nếu người dùng có kết nối không ổn định hoặc không có kết nối Internet, thì sẽ không có video nào xuất hiện. Tình trạng này xảy ra ngay cả khi ứng dụng đã được mở trước đó. Nếu người dùng thoát và chạy lại ứng dụng khi không có Internet, thì ứng dụng sẽ cố gắng tải lại danh sách video xuống nhưng sẽ không thực hiện được.

Bạn có thể xem ví dụ thực tế trên trình mô phỏng.

  1. Tạm thời bật chế độ trên máy bay trong trình mô phỏng Android bằng cách chuyển đến Settings App > Network & Internet > Airplane mode (Cài đặt ứng dụng > Mạng và Internet > Chế độ trên máy bay).
  2. Chạy ứng dụng DevBytes và quan sát thấy màn hình trống.

f0365b27d0dd8f78.png

  1. Hãy nhớ tắt Chế độ trên máy bay trước khi tiếp tục thực hiện các hoạt động còn lại của lớp học lập trình.

Điều này là do sau khi ứng dụng DevBytes tải dữ liệu xuống lần đầu tiên, sẽ không có dữ liệu nào được lưu vào bộ nhớ đệm để dùng sau này. Ứng dụng hiện có cơ sở dữ liệu Room. Nhiệm vụ của bạn là dùng cơ sở dữ liệu này để triển khai chức năng lưu vào bộ nhớ đệm và cập nhật mô hình chế độ xem để sử dụng một kho lưu trữ. Kho lưu trữ này sẽ tải xuống hoặc tìm nạp dữ liệu mới từ cơ sở dữ liệu Room. Lớp kho lưu trữ tách logic này khỏi mô hình chế độ xem, nhờ đó giữ cho mã của bạn luôn được sắp xếp có tổ chức và tách riêng.

Dự án ban đầu được sắp xếp thành nhiều gói.

25b5f8d0997df54c.png

Mặc dù chúng tôi hoan nghênh và khuyến khích bạn tự làm quen với các đoạn mã, nhưng bạn chỉ cần làm việc với 2 tệp: store/VideosRepository.ktviewmodels/DevBytesViewModel. Trước tiên, bạn sẽ tạo một lớp VideosRepository triển khai mẫu kho lưu trữ để lưu vào bộ nhớ đệm (bạn sẽ tìm hiểu thêm về quá trình này trong những trang sau), sau đó cập nhật DevByteViewModel để dùng lớp VideosRepository mới của bạn.

Tuy nhiên, trước khi bắt tay vào làm việc với đoạn mã này, hãy dành chút thời gian để tìm hiểu thêm về chức năng lưu vào bộ nhớ đệm và mẫu kho lưu trữ.

4. Chức năng lưu vào bộ nhớ đệm và mẫu kho lưu trữ

Kho lưu trữ

Mẫu kho lưu trữ là một mẫu thiết kế tách biệt lớp dữ liệu với phần còn lại của ứng dụng. Lớp dữ liệu là phần ứng dụng tách biệt với giao diện người dùng, giúp xử lý dữ liệu và logic nghiệp vụ của ứng dụng, hiển thị các API nhất quán để phần còn lại của ứng dụng truy cập vào dữ liệu này. Mặc dù giao diện người dùng hiển thị thông tin cho người dùng, lớp dữ liệu bao gồm những thứ như đoạn mã nối mạng, cơ sở dữ liệu Room, cách xử lý lỗi và bất kỳ dòng mã nào đọc hoặc sử dụng dữ liệu.

9e528301efd49aea.png

Kho lưu trữ có thể giải quyết xung đột giữa các nguồn dữ liệu (chẳng hạn như mô hình cố định, dịch vụ web và bộ nhớ đệm), đồng thời tập trung vào việc thay đổi dữ liệu này. Sơ đồ dưới đây cho thấy cách một thành phần trong ứng dụng (chẳng hạn như hoạt động) tương tác với nguồn dữ liệu thông qua kho lưu trữ.

69021c8142d29198.png

Để triển khai một kho lưu trữ, bạn hãy dùng một lớp riêng biệt, chẳng hạn như lớp VideosRepository mà bạn tạo trong tác vụ tiếp theo. Lớp kho lưu trữ tách các nguồn dữ liệu khỏi phần còn lại của ứng dụng và cung cấp một API không có lỗi để truy cập dữ liệu cho phần còn lại của ứng dụng. Việc sử dụng một lớp kho lưu trữ sẽ đảm bảo mã này tách biệt với lớp ViewModel. Đây là phương pháp đề xuất hay nhất cho việc phân tách và cấu trúc mã.

Ưu điểm của việc dùng kho lưu trữ

Mô-đun kho lưu trữ xử lý các thao tác với dữ liệu và cho phép bạn dùng nhiều tính năng phụ trợ. Trong một ứng dụng thông thường ngoài đời, kho lưu trữ triển khai logic để quyết định xem có nên tìm nạp dữ liệu từ mạng hay sử dụng kết quả đã được lưu vào bộ nhớ đệm trong cơ sở dữ liệu cục bộ. Với kho lưu trữ, bạn có thể hoán đổi các chi tiết triển khai, chẳng hạn như di chuyển sang thư viện lưu trữ khác mà không ảnh hưởng đến mã gọi, chẳng hạn như mô hình chế độ xem. Thao tác này cũng giúp bạn tạo mã theo mô-đun và có thể thử nghiệm mã này. Bạn có thể dễ dàng mô phỏng kho lưu trữ và thử nghiệm phần còn lại của mã.

Kho lưu trữ phải đóng vai trò là nguồn tin cậy duy nhất cho một phần dữ liệu cụ thể của ứng dụng. Khi làm việc với nhiều nguồn dữ liệu, chẳng hạn như cả tài nguyên mạng và bộ nhớ đệm ngoại tuyến, kho lưu trữ đảm bảo rằng dữ liệu của ứng dụng là chính xác và mới nhất, mang lại trải nghiệm tốt nhất có thể ngay cả khi ứng dụng không kết nối mạng.

Chức năng lưu vào bộ nhớ đệm

Bộ nhớ đệm là kho lưu trữ dữ liệu mà ứng dụng của bạn dùng. Chẳng hạn, bạn có thể tạm thời lưu dữ liệu từ mạng trong trường hợp kết nối Internet của người dùng bị gián đoạn. Ngay cả khi không còn kết nối mạng, ứng dụng vẫn có thể quay lại sử dụng dữ liệu đã lưu vào bộ nhớ đệm. Bộ nhớ đệm cũng có thể hỗ trợ lưu trữ dữ liệu tạm thời cho một hoạt động không còn trên màn hình hoặc thậm chí lưu trữ dữ liệu giữa các lần chạy ứng dụng.

Bộ nhớ đệm có thể có nhiều dạng, một số dạng đơn giản và một số dạng có thể phức tạp hơn, tuỳ thuộc vào từng nhiệm vụ cụ thể. Bảng sau đây trình bày một số cách triển khai chức năng lưu vào bộ nhớ đệm của mạng trong Android.

Kỹ thuật lưu vào bộ nhớ đệm

Cách dùng

Retrofit là một thư viện nối mạng dùng để triển khai một ứng dụng REST loại an toàn cho Android. Bạn có thể định cấu hình Retrofit để lưu trữ cục bộ một bản sao của từng kết quả mạng.

Giải pháp hiệu quả cho các yêu cầu và phản hồi đơn giản, các lệnh gọi không thường xuyên trong mạng hoặc tập dữ liệu nhỏ.

Bạn có thể dùng DataStore để lưu trữ cặp khoá-giá trị.

Giải pháp hiệu quả cho một số ít khoá và giá trị đơn giản, chẳng hạn như các chế độ cài đặt của ứng dụng. Bạn không thể dùng kỹ thuật này để lưu trữ một lượng lớn dữ liệu có cấu trúc.

Bạn có thể truy cập vào thư mục bộ nhớ trong của ứng dụng và lưu các tệp dữ liệu trong đó. Tên gói của ứng dụng nêu rõ thư mục bộ nhớ trong của ứng dụng, nằm tại một vị trí đặc biệt trong hệ thống tệp Android. Thư mục này chỉ dành riêng cho ứng dụng của bạn và sẽ bị xoá khi bạn gỡ cài đặt ứng dụng.

Giải pháp hiệu quả nếu bạn có nhu cầu cụ thể mà hệ thống tệp có thể giải quyết – ví dụ: nếu bạn cần lưu tệp phương tiện hoặc tệp dữ liệu và bạn phải tự quản lý các tệp. Bạn không thể dùng kỹ thuật này để lưu trữ những dữ liệu có cấu trúc và phức tạp mà ứng dụng của bạn cần truy vấn.

Bạn có thể lưu dữ liệu vào bộ nhớ đệm bằng Room. Đây là một thư viện ánh xạ đối tượng SQLite cung cấp một lớp trừu tượng qua SQLite.

Giải pháp đề xuất cho dữ liệu có cấu trúc phức tạp và có thể truy vấn, vì cách tốt nhất để lưu trữ dữ liệu có cấu trúc trên hệ thống tệp của thiết bị là trong một cơ sở dữ liệu SQLite cục bộ.

Trong lớp học lập trình này, bạn sử dụng Room vì đây là cách được đề xuất để lưu trữ dữ liệu có cấu trúc trên hệ thống tệp của thiết bị. Ứng dụng DevBytes đã được định cấu hình để dùng Room. Nhiệm vụ của bạn là triển khai chức năng lưu vào bộ nhớ đệm khi không có kết nối mạng bằng cách dùng mẫu kho lưu trữ để tách lớp dữ liệu khỏi mã giao diện người dùng.

5. Triển khai VideosRepository

Nhiệm vụ: Tạo kho lưu trữ

Trong nhiệm vụ này, bạn sẽ tạo một kho lưu trữ để quản lý bộ nhớ đệm ngoại tuyến. Đây là kho lưu trữ mà bạn đã triển khai trong nhiệm vụ trước. Cơ sở dữ liệu Room của bạn không có logic để quản lý bộ nhớ đệm ngoại tuyến. Cơ sở dữ liệu này chỉ có các phương thức chèn, cập nhật, xoá và truy xuất dữ liệu. Kho lưu trữ sẽ có logic để tìm nạp kết quả mạng và giữ cho cơ sở dữ liệu luôn cập nhật.

Bước 1: Thêm một kho lưu trữ

  1. Trong repository/VideosRepository.kt, hãy tạo một lớp VideosRepository. Truyền vào một đối tượng VideosDatabase ở dạng thông số hàm khởi tạo của lớp để truy cập vào các phương thức DAO.
class VideosRepository(private val database: VideosDatabase) {
}
  1. Bên trong lớp VideosRepository, hãy thêm một phương thức suspend có tên là refreshVideos() mà không có đối số và không trả về giá trị nào. Phương thức này sẽ là API dùng để làm mới bộ nhớ đệm ngoại tuyến.
suspend fun refreshVideos() {
}
  1. Bên trong phương thức refreshVideos(), hãy chuyển ngữ cảnh coroutine thành Dispatchers.IO để thực hiện các thao tác trên mạng và cơ sở dữ liệu.
suspend fun refreshVideos() {
   withContext(Dispatchers.IO) {
   }
}
  1. Bên trong khối withContext, hãy tìm nạp danh sách phát video DevByte từ mạng bằng cách sử dụng phiên bản dịch vụ Retrofit, DevByteNetwork.
val playlist = DevByteNetwork.devbytes.getPlaylist()
  1. Bên trong phương thức refreshVideos(), sau khi tìm nạp danh sách phát từ mạng, hãy lưu trữ danh sách phát đó trong cơ sở dữ liệu Room. Để lưu trữ danh sách phát, hãy dùng lớp VideosDatabase. Gọi phương thức DAO của insertAll(), truyền vào danh sách phát được truy xuất từ mạng. Dùng hàm tiện ích asDatabaseModel() để liên kết danh sách phát đó với đối tượng cơ sở dữ liệu.
database.videoDao.insertAll(playlist.asDatabaseModel())
  1. Sau đây là một phương thức refreshVideos() hoàn chỉnh sử dụng câu lệnh nhật ký để theo dõi thời điểm phương thức này được gọi:
suspend fun refreshVideos() {
   withContext(Dispatchers.IO) {
       val playlist = DevByteNetwork.devbytes.getPlaylist()
       database.videoDao.insertAll(playlist.asDatabaseModel())
   }
}

Bước 2: Truy xuất dữ liệu từ cơ sở dữ liệu

Ở bước này, bạn tạo một đối tượng LiveData để đọc danh sách phát video trong cơ sở dữ liệu. Đối tượng LiveData này được cập nhật tự động khi cơ sở dữ liệu được cập nhật. Mảnh đính kèm, hoặc hoạt động, được làm mới bằng các giá trị mới.

  1. Trong lớp VideosRepository, hãy khai báo một đối tượng LiveData có tên là videos để lưu giữ danh sách đối tượng DevByteVideo. Khởi động đối tượng videos bằng database.videoDao. Gọi phương thức DAO của getVideos(). Vì phương thức getVideos() trả về danh sách đối tượng cơ sở dữ liệu chứ không phải danh sách đối tượng DevByteVideo nên Android Studio sẽ gửi lỗi "không khớp loại".
val videos: LiveData<List<DevByteVideo>> = database.videoDao.getVideos()
  1. Để khắc phục lỗi này, hãy dùng Transformations.map để chuyển đổi danh sách đối tượng cơ sở dữ liệu thành danh sách đối tượng miền bằng cách sử dụng hàm chuyển đổi asDomainModel().
val videos: LiveData<List<DevByteVideo>> = Transformations.map(database.videoDao.getVideos()) {
   it.asDomainModel()
}

Giờ đây, bạn đã triển khai một kho lưu trữ cho ứng dụng của mình. Trong nhiệm vụ tiếp theo, bạn sẽ vận dụng một chiến lược làm mới đơn giản để luôn cập nhật cơ sở dữ liệu cục bộ.

6. Sử dụng VideosRepository trong DevByteViewModel

Nhiệm vụ: Tích hợp kho lưu trữ bằng chiến lược làm mới

Trong nhiệm vụ này, bạn tích hợp kho lưu trữ của mình với ViewModel bằng một chiến lược làm mới đơn giản. Bạn hiển thị danh sách phát video từ cơ sở dữ liệu Room, chứ không tìm nạp trực tiếp từ mạng.

Làm mới cơ sở dữ liệu là quá trình cập nhật hoặc làm mới cơ sở dữ liệu cục bộ để cơ sở dữ liệu đó luôn đồng bộ với dữ liệu từ mạng. Đối với ứng dụng mẫu này, bạn sẽ vận dụng một chiến lược làm mới đơn giản, trong đó mô-đun yêu cầu dữ liệu từ kho lưu trữ chịu trách nhiệm làm mới dữ liệu cục bộ.

Trong một ứng dụng thực tế, chiến lược của bạn có thể phức tạp hơn. Ví dụ: mã của bạn có thể tự động làm mới dữ liệu ở chế độ nền (có tính đến băng thông) hoặc lưu vào bộ nhớ đệm những dữ liệu mà người dùng rất có thể sẽ sử dụng tiếp theo.

  1. Trong viewmodels/DevByteViewModel.kt, bên trong lớp DevByteViewModel, hãy tạo một biến thành viên riêng tư có tên là videosRepository thuộc loại VideosRepository. Tạo bản sao của biến này bằng cách truyền vào đối tượng singleton VideosDatabase.
private val videosRepository = VideosRepository(getDatabase(application))
  1. Trong lớp DevByteViewModel, hãy thay thế phương thức refreshDataFromNetwork() bằng phương thức refreshDataFromRepository(). Phương thức cũ, refreshDataFromNetwork(), đã tìm nạp danh sách phát video từ mạng bằng cách sử dụng thư viện Retrofit. Phương thức mới tải danh sách phát video từ kho lưu trữ. Kho lưu trữ xác định nguồn (ví dụ: mạng, cơ sở dữ liệu, v.v) mà danh sách phát được truy xuất từ đó, lưu trữ chi tiết triển khai ở ngoài mô hình chế độ xem. Kho lưu trữ cũng giúp mã của bạn dễ bảo trì hơn; nếu sau này thay đổi phương thức triển khai để nhận dữ liệu, thì bạn không cần sửa đổi mô hình chế độ xem.
private fun refreshDataFromRepository() {
   viewModelScope.launch {
       try {
           videosRepository.refreshVideos()
           _eventNetworkError.value = false
           _isNetworkErrorShown.value = false

       } catch (networkError: IOException) {
           // Show a Toast error message and hide the progress bar.
           if(playlist.value.isNullOrEmpty())
               _eventNetworkError.value = true
       }
   }
}
  1. Trong lớp DevByteViewModel, bên trong khối init, hãy thay đổi lệnh gọi hàm từ refreshDataFromNetwork() thành refreshDataFromRepository(). Mã này tìm nạp danh sách phát video từ kho lưu trữ, chứ không tìm nạp trực tiếp từ mạng.
init {
   refreshDataFromRepository()
}
  1. Trong lớp DevByteViewModel, hãy xoá thuộc tính _playlist và thuộc tính dự phòng playlist của thuộc tính này.

Mã cần xoá

private val _playlist = MutableLiveData<List<Video>>()
...
val playlist: LiveData<List<Video>>
   get() = _playlist
  1. Trong lớp DevByteViewModel, sau khi tạo bản sao của đối tượng videosRepository, hãy thêm một val mới có tên là playlist để lưu giữ danh sách video LiveData từ kho lưu trữ.
val playlist = videosRepository.videos
  1. Chạy ứng dụng. Ứng dụng này chạy như trước, nhưng giờ đây, danh sách phát DevBytes được tìm nạp từ mạng và lưu vào cơ sở dữ liệu Room. Danh sách phát này hiển thị trên màn hình từ cơ sở dữ liệu Room, chứ không phải hiển thị trực tiếp từ mạng.

30ee74d946a2f6ca.png

  1. Để nhận thấy điểm khác biệt, hãy bật chế độ trên máy bay trên trình mô phỏng hoặc thiết bị.
  2. Chạy lại ứng dụng. Lưu ý rằng thông báo ngắn "Network Error" (Lỗi mạng) sẽ không hiện ra. Thay vào đó, danh sách phát sẽ được tìm nạp từ bộ nhớ đệm ngoại tuyến và hiển thị.
  3. Tắt chế độ trên máy bay trong trình mô phỏng hoặc thiết bị.
  4. Đóng rồi mở lại ứng dụng YouTube. Ứng dụng này sẽ tải danh sách phát từ bộ nhớ đệm ngoại tuyến, còn yêu cầu mạng sẽ chạy trong nền.

Nếu dữ liệu mới đến từ mạng, màn hình sẽ tự động cập nhật để hiển thị dữ liệu mới. Tuy nhiên, máy chủ DevBytes không làm mới nội dung của mình, vì vậy bạn sẽ không thấy dữ liệu cập nhật.

Tuyệt vời! Trong lớp học lập trình này, bạn đã tích hợp một bộ nhớ đệm ngoại tuyến với ViewModel để hiển thị danh sách phát từ kho lưu trữ thay vì tìm nạp danh sách phát từ mạng.

7. Mã giải pháp

Mã giải pháp

Dự án Android Studio: RepositoryPattern

8. Xin chúc mừng

Xin chúc mừng! Trong lộ trình này, bạn đã học được:

  • Lưu vào bộ nhớ đệm là quá trình lưu trữ dữ liệu được tìm nạp từ một mạng trên bộ nhớ của thiết bị. Việc lưu vào bộ nhớ đệm cho phép ứng dụng truy cập dữ liệu khi thiết bị không có kết nối mạng hoặc nếu ứng dụng cần truy cập lại vào chính dữ liệu đó.
  • Cách tốt nhất để ứng dụng của bạn lưu trữ dữ liệu có cấu trúc trên hệ thống tệp của thiết bị là dùng cơ sở dữ liệu SQLite cục bộ. Room là một thư viện ánh xạ đối tượng SQLite, nghĩa là thư viện này cung cấp một lớp trừu tượng trên SQLite. Sử dụng Room là phương pháp hay nhất được đề xuất để triển khai chức năng lưu vào bộ nhớ đệm khi không có kết nối mạng.
  • Lớp kho lưu trữ tách biệt các nguồn dữ liệu (chẳng hạn như cơ sở dữ liệu Room và các dịch vụ web) khỏi phần còn lại của ứng dụng. Lớp kho lưu trữ cung cấp một API không có lỗi để truy cập vào dữ liệu cho phần còn lại của ứng dụng.
  • Sử dụng kho lưu trữ là một phương pháp đề xuất hay nhất giúp phân tách và cấu trúc mã.
  • Khi thiết kế bộ nhớ đệm ngoại tuyến, bạn nên tách các đối tượng mạng, miền và cơ sở dữ liệu của ứng dụng. Chiến lược này là một ví dụ về cách tách biệt các vấn đề.

Tìm hiểu thêm