2017-11-16 51 views
5

Tôi đã khám phá thư viện lập bản đồ đối tượng cơ sở dữ liệu Room và tôi đã tìm ra điều gì đó kỳ lạ.Tại sao các thực thể Phòng không hoạt động với các thuộc tính bất biến trong Android

Mô hình dữ liệu thực thể không được có các thuộc tính bất biến, như câu trả lời this đề xuất.

Nhưng tôi đã xem google's persistent example with kotlin, Room cũng hoạt động với các thuộc tính không thể thay đổi được. Vui lòng kiểm tra this lớp dữ liệu từ ví dụ.

Điều gì có thể là lý do cho hành vi này? Đây có thể là một tính năng tốt nếu chúng ta có thể tạo ra các giá trị bất biến (val thuộc tính), vì điều này hạn chế các lập trình viên thay đổi định danh duy nhất như id sau khi một đối tượng đã được tạo.

+0

Tôi không phải là một chuyên gia về phòng đặc biệt, nhưng tôi tin rằng nếu bạn muốn sử dụng 'val ', bạn cần cung cấp các giá trị mặc định cho mọi thứ vì nó có thể dựa vào một hàm tạo mặc định hoặc một cái gì đó trừ khi điều này đã thay đổi gần đây. Ngoài ra, bạn sẽ không thể thay đổi giá trị khi chúng được đặt. –

+0

@JanVladimirMostert Cảm ơn bạn đã trả lời. Tôi đã kiểm tra rằng với các giá trị mặc định, vẫn còn vấn đề dường như xảy ra –

Trả lời

1

Đó là lạ bởi vì tôi có thể làm cho lớp Entity tôi sử dụng val cho tất cả các lĩnh vực của tôi mà không một vấn đề

@Entity(tableName = "repo") 
data class RepoEntity(
     @PrimaryKey @ColumnInfo(name = "id") @SerializedName("id") val id: Int, 
     @ColumnInfo(name = "name") @SerializedName("name") val name: String, 
     @ColumnInfo(name = "full_name") @SerializedName("full_name") val fullName: String, 
     @Embedded(prefix = "owner") @SerializedName("owner") val owner: RepoOwnerEntity, 
     @ColumnInfo(name = "html_url") @SerializedName("html_url") val htmlUrl: String, 
     @ColumnInfo(name = "description") @SerializedName("description") val description: String? 
) 

Và các dữ liệu vẫn được lưu trữ một cách chính xác bên trong cơ sở dữ liệu. enter image description here

+0

Bạn có thể đăng các tập tin gradle của bạn? Cả cấp độ dự án và cấp mô-đun? –

+0

Bạn có thể kiểm tra tất cả mã trên repo github của tôi> https://github.com/RR12/KU-Android-Project-Setup tất cả các công cụ liên quan đến db phải nằm trên mô-đun dữ liệu '. –

0

Tôi tin rằng vấn đề bắt nguồn từ một số trường không thể là tham số hàm tạo. Từ Javadoc của @Relation chú thích:

Lưu ý rằng @Relation lĩnh vực chú thích không thể là một tham số nhà xây dựng, nó phải được công khai hoặc có một setter công cộng.

Là một workaround, tôi đã có một tham số tin constructor _myRelationProperty và một lĩnh vực công cộng:

val myRelationProperty: List<MyThings> get() = _myRelationProperty

Các vấn đề liên quan