Android Room: Không có giá trị nào được truyền vào tham số ‘id’
Ngày cập nhật: 2021-02-07 | Lượt xem: 7674 | Số từ: 274 | Phân loại: Kotlin
Bạn đang sử dụng Kotlin để định nghĩa một lớp Entity
đơn giản trong Room là Todo
, với đoạn mã như sau:
|
|
Tuy nhiên, khi bạn tạo một đối tượng Todo
mới theo cách thông thường như sau:
|
|
Bạn lại gặp phải lỗi sau:
Không có giá trị nào được truyền vào tham số ‘id’
Lỗi này xảy ra do bạn đã khai báo id
trong constructor của data class
. Để khắc phục, bạn nên di chuyển id
ra khỏi constructor và khởi tạo nó bên ngoài. Cấu trúc mới sẽ trông như sau:
|
|
Với cách làm này, bạn không cần phải cung cấp giá trị cho id
khi tạo đối tượng.
Lưu ý khi cập nhật schema
Do bạn đã thay đổi cấu trúc của Entity, khi chạy ứng dụng trên máy mô phỏng (simulator), bạn cần gỡ bỏ phiên bản cũ trước đó rồi cài đặt lại. Nếu không làm như vậy, bạn sẽ gặp lỗi:
java.lang.IllegalStateException: Room không thể kiểm tra tính toàn vẹn dữ liệu. Dường như bạn đã thay đổi schema nhưng quên cập nhật số phiên bản. Bạn chỉ cần tăng số phiên bản lên để sửa lỗi này.
Nếu bạn vẫn giữ nguyên database version và cố gắng chạy ứng dụng mà không thêm logic migration, bạn sẽ tiếp tục gặp lỗi:
java.lang.IllegalStateException: Cần có một migration từ phiên bản 1 sang 2 nhưng không tìm thấy. Vui lòng cung cấp đường dẫn migration cần thiết bằng cách sử dụng
RoomDatabase.Builder.addMigration(Migration...)
hoặc cho phép migration phá hủy bằng một trong các phương thứcfallbackToDestructiveMigration*
.
Giải pháp tối ưu nhất
Để tránh những lỗi phức tạp liên quan đến migration, giải pháp nhanh chóng và an toàn nhất là gỡ cài đặt ứng dụng cũ và cài lại phiên bản mới. Điều này đặc biệt hữu ích trong giai đoạn phát triển khi bạn thường xuyên thay đổi schema cơ sở dữ liệu.
Kết luận
Khi làm việc với Room trong Android, hãy luôn lưu ý rằng nếu bạn thay đổi schema của bảng (ví dụ như thêm/xóa/trừ các trường), bạn cần xử lý migration hoặc đơn giản là gỡ bỏ ứng dụng để đảm bảo sự nhất quán giữa cơ sở dữ liệu và mã nguồn. Việc di chuyển id
ra khỏi constructor cũng là một mẹo nhỏ giúp bạn tránh các lỗi về thiếu tham số khi tạo đối tượng Entity
.