1. Phòng cơ sở dữ liệu ORM chính thức của Android.
Android sử dụng Sqlite làm nơi lưu trữ cơ sở dữ liệu. Tuy nhiên, do mã Sqlite cồng kềnh và dễ viết nên Google đã tung ra Room. Trên thực tế, Room đóng gói một lớp khác bên trên Sqlite. Sau đây là sơ đồ kiến trúc của Room:
Để hiểu rõ hơn về sơ đồ trên, trước tiên chúng ta cần hiểu một số khái niệm: Thực thể và Đạo.
Entity: Thực thể, một thực thể tương ứng với một bảng trong cơ sở dữ liệu. Lớp Entity là ánh xạ các bảng trong Sqlite sang các lớp Java. Ví dụ: có một bảng sinh viên có ba trường: id, name và age; sau đó có một lớp sinh viên tương ứng, với ba biến thành viên là id, name, và tuổi và học sinh Các trường trong bảng có sự tương ứng 1-1.
Dao: Đối tượng truy cập dữ liệu, nghĩa đen là dữ liệu trong cơ sở dữ liệu có thể được truy cập thông qua nó.
Sau đó, cái gọi là ORM (Ánh xạ quan hệ đối tượng) rất dễ hiểu. Đó là thiết lập ánh xạ từ bảng cơ sở dữ liệu đến lớp Java. Các trường trong bảng tương ứng với các biến thành viên trong lớp và các bản ghi trong bảng tương ứng với một thể hiện của lớp.
2. Cách sử dụng cơ bản cơ sở dữ liệu Room.
1. Trước khi sử dụng cơ sở dữ liệu Room, trước tiên bạn phải nhập các phần phụ thuộc sau vào tệp app/build.gradle:
triển khai 'androidx.room:room-runtime:2.5.2'
chú thíchBộ xử lý 'androidx.room:room-compiler:2.5.2'
2. Tạo Entity về sinh viên, tức là tạo bảng sinh viên:
@Thực thể
lớp công khai Học sinh {
@Khóa chính
số nguyên riêng tư id;
@ColumnInfo(tên="tên",typeAffinity = ColumnInfo.TEXT)
chuỗi tên riêng tư;
@ColumnInfo(tên="tuổi",typeAffinity = ColumnInfo.INTEGER)
số nguyên riêng tư tuổi;
công khai Integer getId() {
trả về id;
}
công khai void setId(Số nguyên id) {
id này = id;
}
công khai String getName() {
trả về tên;
}
public void setName(String name) {
this.name = tên;
}
công khai Integer getAge() {
tuổi trở về;
}
public void setAge(Tuổi nguyên) {
this.age = tuổi;
}
public Student(Số nguyên id, Tên chuỗi, Số nguyên tuổi) {
id này = id;
this.name = tên;
this.age = tuổi;
}
@Ghi đè
công khai String toString() {
trả về "Sinh viên{" +
"mã số=" + mã số +
", tên='" + tên + '\'' +
", tuổi=" + tuổi +
'}';
}
}
Chú thích @Entity được sử dụng để ánh xạ lớp Sinh viên tới bảng dữ liệu trong cơ sở dữ liệu Room; chú thích @PrimaryKey là ràng buộc khóa chính; chú thích @ColumnInfo có thể đặt tên và loại trường trong bảng tương ứng với thành viên; biến.
Một điều cần lưu ý là phương thức get không thể bỏ qua.
3. Đối với lớp sinh viên Thực thể ở trên, chúng ta cần xác định tệp giao diện Dao để truy cập cơ sở dữ liệu. Chỉ cần thêm chú thích @Dao phía trên giao diện.
@Dao
công cộng
giao diện
StudentDao { @Chèn
vô hiệu
insertStudent(Sinh viên sinh viên); @Xóa
vô hiệu
deleteStudent(Sinh viên sinh viên); @Cập nhật
vô hiệu
updataStudent(Sinh viên sinh viên); @Query(
"chọn * từ Học sinh"
) Dữ liệu trực tiếp
>
lấy tất cả học sinh(); @Query(
"chọn * từ học sinh có id=:id"
) Sinh viên selectStudentById(Số nguyên id); }
4. Sau khi xác định Thực thể và Dao, bước tiếp theo là tạo cơ sở dữ liệu như sau:
@Database(thực thể = {Sinh viên.
lớp học
},phiên bản = 1
)
công cộng
tóm tắt
lớp học
Cơ sở dữ liệu của tôi
mở rộng
Cơ sở dữ liệu phòng {
riêng tư
tĩnh
cuối cùng
Chuỗi DATABASE_NAME="my_db"
;
riêng tư
tĩnh
Cơ sở dữ liệu của tôi Cơ sở dữ liệu của tôi;
công cộng
tĩnh
đồng bộ
MyDatabase getInstance(Bối cảnh ngữ cảnh){
nếu như
(Cơ sở dữ liệu của tôi==
vô giá trị
){ Cơ sở dữ liệu của tôi
= Room.databaseBuilder(bối cảnh,MyDatabase.
lớp học
,TÊN_CƠ_SỞ_DỮ_Liệu).build(); }
trở lại
myDatabase; } @Ghi đè
công cộng
vô hiệu
clearAllTables() { } @NonNull @Ghi đè
được bảo vệ
Trình theo dõi vô hiệu hóa tạo ra Trình theo dõi vô hiệu hóa() {
trở lại
vô giá trị
; } @NonNull @Ghi đè
được bảo vệ
Hỗ trợSQLiteOpenHelper createOpenHelper(@NonNull DatabaseConfiguration databaseConfiguration) {
trở lại
vô giá trị
; }
công cộng
tóm tắt
StudentDao studentDao(); }
Chú thích @Database được sử dụng để cho hệ thống biết rằng đây là đối tượng cơ sở dữ liệu Room, thuộc tính thực thể được sử dụng để chỉ định cơ sở dữ liệu có bảng nào và phiên bản được sử dụng để chỉ định số phiên bản của cơ sở dữ liệu.
Lớp cơ sở dữ liệu cần kế thừa lớp RoomDatabase và kết hợp nó với chế độ singleton để hoàn tất quá trình tạo.
Tại thời điểm này, cơ sở dữ liệu và bảng đã được tạo. Tiếp theo, hãy xem cách thêm, xóa, sửa đổi và kiểm tra cơ sở dữ liệu.
5. Kết hợp ViewModel và LiveData để thêm, xóa, sửa đổi và truy vấn cơ sở dữ liệu Khi các bản ghi trong bảng cơ sở dữ liệu thay đổi, trang có thể nhận được thông báo kịp thời và cập nhật trang.
LiveData thường được sử dụng cùng với ViewModel. ViewModel dùng để lưu trữ dữ liệu trang nên chúng ta có thể đưa việc khởi tạo cơ sở dữ liệu vào ViewModel. Tuy nhiên, việc khởi tạo cơ sở dữ liệu yêu cầu sử dụng đối tượng Context nên chúng ta không nên sử dụng trực tiếp ViewModel. , nhưng nên sử dụng Lớp con AndroidViewModel khác. .
công cộng
lớp học
Mô hình xem sinh viên
mở rộng
AndroidViewModel {
riêng tư
Cơ sở dữ liệu của tôi Cơ sở dữ liệu của tôi;
riêng tư
LiveData>
liveDataStudents;
công cộng
StudentViewModel(@NonNull Ứng dụng ứng dụng) {
siêu
(ứng dụng); myDatabase
=
MyDatabase.getInstance(ứng dụng); liveDataStudents
=
myDatabase.studentDao().getAllStudents(); }
công cộng
LiveData>
lấyLiveDataSinh viên(){
trở lại
liveDataStudents; }
công cộng
vô hiệu
insertStudent(Sinh viên sinh viên){ myDatabase.studentDao().insertStudent(sinh viên); }
công cộng
vô hiệu
deleteStudent(Sinh viên sinh viên){ myDatabase.studentDao().deleteStudent(sinh viên); }
công cộng
vô hiệu
updateStudent(Sinh viên sinh viên){ myDatabase.studentDao().updataStudent(sinh viên); }
công cộng
Sinh viên chọnStudentById(Integer id){
trở lại
myDatabase.studentDao().selectStudentById(id); } }
6. Khởi tạo Sinh viênViewModel trong Hoạt động, thực hiện các thao tác thêm, xóa, sửa đổi và truy vấn cũng như theo dõi các thay đổi trong LiveData.
công cộng
lớp học
Hoạt động chính
mở rộng
Hoạt động tương thích của ứng dụng
thực hiện
Xem.OnClickListener {
riêng tư
Nút btn_insert,btn_delete,btn_update,btn_select;
riêng tư
Hiển thị văn bản tv_display;
riêng tư
Mô hình StudentViewModel;
riêng tư
ExecutorService thực thi =
Executors.newSingleThreadExecutor();
riêng tư
Sinh viên sinh viên; @SuppressLint(
"MissingInflatedId"
) @Ghi đè
được bảo vệ
vô hiệu
onCreate(Gói savedInstanceState) {
siêu
.onCreate(savedInstanceState); thiết lậpContentView(R.layout.activity_main); màn hình tv
=
tìmViewById(R.id.tv_display); btn_delete
=
tìmViewById(R.id.btn_delete); btn_insert
=
tìmViewById(R.id.btn_insert); btn_update
=
tìmViewById(R.id.btn_update); btn_select
=
findViewById(R.id.btn_select); btn_select.setOnClickListener(
cái này
); btn_insert.setOnClickListener(
cái này
); btn_delete.setOnClickListener(
cái này
); btn_update.setOnClickListener(
cái này
); studentViewModel
=
mới
Nhà cung cấp ViewModel(
cái này
,
mới
MyViewModelFactory(getApplication())).get(StudentViewModel.
lớp học
); studentViewModel.getLiveDataStudents().quan sát(
cái này
,
mới
Người quan sát>
() { @Ghi đè
công cộng
vô hiệu
onChanged(Danh sách
sinh viên) { tv_display.setText(sinh viên
+""
); } }); } @Ghi đè
công cộng
vô hiệu
onClick(Xem chế độ xem) {
công tắc
(xem.getId()){
trường hợp
R.id.btn_delete: lệnh thực thi(
mới
Có thể chạy() { @Override
công cộng
vô hiệu
chạy() { studentViewModel.deleteStudent(
mới
Học sinh(1,"jack",20
)); } });
phá vỡ
;
trường hợp
R.id.btn_update: thực thi(
mới
Có thể chạy() { @Override
công cộng
vô hiệu
chạy() { studentViewModel.cập nhậtStudent(
mới
Học sinh(1,"zhangsan",32
)); } });
phá vỡ
;
trường hợp
R.id.btn_insert: trình thực thi.execute(
mới
Có thể chạy() { @Override
công cộng
vô hiệu
chạy() { studentViewModel.insertStudent(
mới
Học sinh(1,"lisi",22
)); } });
phá vỡ
;
trường hợp
R.id.btn_select: lệnh thực thi(
mới
Có thể chạy() { @Override
công cộng
vô hiệu
chạy() { sinh viên
= studentViewModel.selectStudentById(1
); Log.i(
"Bài kiểm tra"
,sinh viên.toString()); } });
phá vỡ
; } } }
công cộng
lớp học
Nhà máy MyViewModel
thực hiện
ViewModelProvider. Nhà máy {
riêng tư
Ứng dụng ứng dụng;
công cộng
MyViewModelFactory(Ứng dụng ứng dụng){
cái này
.ứng dụng=
ứng dụng; } @NonNull @Override
công cộng
mở rộng
ViewModel> T tạo(@NonNull Lớp
Lớp mô hình) {
trở lại
(T)
mới
StudentViewModel(ứng dụng); } }
Khi ứng dụng được chạy và cơ sở dữ liệu được thêm, xóa hoặc sửa đổi, phương thức onChanged sẽ được gọi lại và sau đó trang có thể được cập nhật theo phương thức này.
。
Cuối cùng, bài viết về cách sử dụng các thành phần Room này kết thúc tại đây. Nếu bạn muốn biết thêm về cách sử dụng các thành phần Room, vui lòng tìm kiếm các bài viết về CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!