Data Access Objects – DAO trong Room

Giới thiệu Chào 500 ae! Hôm nay mình sẽ tiếp tục series tìm hiểu về thư viện Room trong Android. Ở bài trước (Link), mình đã trình bày về cách chúng ta có thể sử dụng thư viện Room để tạo cơ sở dữ liệu quan hệ rất dễ dàng. Một số lợi thế của

Giới thiệu

Chào 500 ae! Hôm nay mình sẽ tiếp tục series tìm hiểu về thư viện Room trong Android.

Ở bài trước (Link), mình đã trình bày về cách chúng ta có thể sử dụng thư viện Room để tạo cơ sở dữ liệu quan hệ rất dễ dàng. Một số lợi thế của việc sử dụng Room là xác minh truy vấn thời gian biên dịch, không có mã soạn sẵn và dễ dàng tích hợp với RxJava, LiveData và Kotlin Coroutines. Tất cả những lợi thế này trong Room đều đạt được bằng cách sử dụng Data Access Objects (DAO).

Trong bài viết này, chúng ta sẽ thảo luận chi tiết về Data Access Objects (DAO).

Trong Room, DAO được sử dụng để truy cập dữ liệu lâu dài của ứng dụng của bạn. Chúng là cách tốt hơn và mang tính mô-đun để truy cập cơ sở dữ liệu của bạn so với trình tạo truy vấn hoặc truy vấn trực tiếp.

DAO có thể là một interface hoặc một abstract class. Nếu đó là một lớp trừu tượng, nó có thể tùy chọn có một phương thức khởi tạo lấy RoomDatabase làm tham số duy nhất của nó. Room tạo mỗi triển khai DAO tại thời điểm biên dịch.

Bạn có thể thực hiện nhiều hoạt động bằng cách sử dụng DAO như Insertion, Updation, Deletion và thực hiện các truy vấn khác. Ngoài ra, bạn có thể dễ dàng tích hợp LiveData, RxJava Observables, Kotlin Coroutines trong DAO.

Insertion

Khi bạn tạo một phương thức DAO và chú thích nó bằng @Insert, Room sẽ tạo một triển khai chèn tất cả các tham số vào cơ sở dữ liệu trong single transaction.

@Daointerface UserDao {@Insert(onConflict = OnConflictStrategy.REPLACE)funinsertUsers(vararg users: User)@InsertfuninsertBothUsers(user1: User, user2: User)@InsertfuninsertUsersAndFriends(user: User, friends: List<User>)}

Tham số chú thích onConflict cho biết phải làm gì nếu xung đột xảy ra khi chèn. Nó có thể nhận các giá trị sau:

  • OnConflictStrategy.REPLACE : Để thay thế dữ liệu cũ và tiếp tục transaction
  • OnConflictStrategy.ROLLBACK : Để khôi phục transaction.
  • OnConflictStrategy.ABORT : Để hủy bỏ transaction. transaction được quay trở lại.
  • OnConflictStrategy.FAIL : Để transaction thất bại. transaction được quay trở lại.
  • OnConflictStrategy.NONE : Để bỏ qua xung đột.

Lưu ý: Các chiến lược ROLLBACK và FAIL không được dùng nữa. Sử dụng ABORT để thay thế.

Updation

Khi bạn tạo một phương thức DAO và chú thích nó bằng @Update, Room sẽ tạo một triển khai sửa đổi một tập hợp các thực thể, được cung cấp dưới dạng tham số, trong cơ sở dữ liệu. Nó sử dụng một truy vấn khớp với khóa chính của mỗi thực thể.

@Daointerface UserDao {@Update(onConflict = OnConflictStrategy.REPLACE)funupdateUsers(vararg users: User)@Updatefunupdate(user: User)}

Deletion

Khi bạn tạo một phương thức DAO và chú thích nó bằng @Delete, Room sẽ tạo một triển khai loại bỏ một tập hợp các thực thể, được cung cấp dưới dạng tham số, khỏi cơ sở dữ liệu. Nó sử dụng các khóa chính để tìm các thực thể cần xóa.

@Daointerface UserDao {@DeletefundeleteUsers(vararg users: User)}

Simple queries

@ Query là chú thích chính được sử dụng trong các lớp DAO. Nó cho phép bạn thực hiện các thao tác đọc / ghi trên cơ sở dữ liệu. Mỗi phương thức @ Query đều được xác minh tại thời điểm biên dịch, vì vậy nếu có vấn đề với truy vấn, lỗi biên dịch sẽ xảy ra thay vì lỗi thời gian chạy.

Room cũng xác minh giá trị trả về của truy vấn sao cho nếu tên của trường trong đối tượng được trả về không khớp với tên cột tương ứng trong phản hồi truy vấn, Room sẽ thông báo cho bạn theo một trong hai cách sau:

  • Nó đưa ra một warning nếu chỉ một số tên trường trùng khớp.
  • Nó đưa ra một error nếu không có tên trường nào phù hợp.
@Daointerface UserDao {@Query("SELECT * FROM users")funloadAllUsers(): Array<User>}

Chuyển các tham số vào truy vấn

Các tham số được truyền cho các phương thức DAO có thể được sử dụng vào truy vấn được viết bằng chú thích @Query.

@Daointerface UserDao {@Query("SELECT * FROM users WHERE age BETWEEN :minAge AND :maxAge")funloadAllUsersBetweenAges(minAge: Int, maxAge: Int): Array<User>@Query("SELECT * FROM users WHERE first_name LIKE :search "+"OR last_name LIKE :search")funfindUserWithName(search: String): List<User>}

Trả lại tập hợp con của các cột

Bạn cũng có thể trả về các tập hợp con của các cột từ một truy vấn trong Room.

dataclassNameTuple(@ColumnInfo(name ="first_name")val firstName: String?,@ColumnInfo(name ="last_name")val lastName: String?)@Daointerface UserDao {@Query("SELECT first_name, last_name FROM users")funloadFullName(): List<NameTuple>}

Truy cập trực tiếp con trỏ

Nếu logic của ứng dụng của bạn yêu cầu quyền truy cập trực tiếp vào các hàng trả về, bạn có thể trả về đối tượng Cursor từ các truy vấn của mình.

@Daointerface UserDao {@Query("SELECT * FROM users")funloadAllUsers(): Cursor
}

Truy vấn nhiều bảng

Một số truy vấn của bạn có thể yêu cầu quyền truy cập vào nhiều bảng để tính toán kết quả. Room cho phép bạn viết bất kỳ truy vấn nào, vì vậy bạn cũng có thể join table. Hơn nữa, nếu phản hồi là kiểu dữ liệu observable, chẳng hạn như Flowable hoặc LiveData, Room sẽ xem tất cả các bảng được tham chiếu trong truy vấn để tìm kiếm sự vô hiệu.

@Daointerface BookDao {@Query("SELECT * FROM book "+"INNER JOIN loan ON loan.book_id = book.id "+"INNER JOIN user ON user.id = loan.user_id "+"WHERE users.name LIKE :userName")funfindBooksBorrowedByNameSync(userName: String): List<Book>}

Truy vấn trả về type

Room hỗ trợ nhiều loại trả về cho các phương thức truy vấn, bao gồm trả về type chuyên biệt cho khả năng tương tác với các khung hoặc API cụ thể.

Bạn có thể trả về LiveData, ObservableFlow từ các phương thức truy vấn. Ngoài ra, bạn có thể thực hiện chức năng tạm ngưng phương pháp DAO. Những điều này được thảo luận trong các bài riêng biệt.

Kết luận

Trên đây là tất cả về DAO trong Room. Hi vọng bài viết của mình sẽ giúp ích được cho ae! Cảm ơn cả nhà đã đọc đến tận đây 😄

Nguồn tham khảo: https://blog.mindorks.com/data-access-objects-dao-in-room

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ