Cách giải quyết

Cách giải quyết

iwin68.club phiên bản mới,66 Club Game Bài 79

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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "todos")
data class Todo(
    @PrimaryKey(autoGenerate = true) var id: Int,
    var title: String,
    var content: String,
) {
    override fun toString() = title
}

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:

1
val todo = Todo(title = title, content = content)

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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
@Entity(tableName = "todos")
data class Todo(
    var title: String,
    var content: String,
) {
    @PrimaryKey(autoGenerate = true)
    var id: Int = 0

    override fun toString() = title
}

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ức fallbackToDestructiveMigration*.

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.

comments powered by Disqus
Built with Hugo
Theme Stack thiết kế bởi Jimmy