Cơ sở dữ liệu phòng với lớp nội tuyến Kotlin dưới dạng trường Thực thể


9

Tôi đang cố gắng để Room ( https://developer.android.com/topic/lologists/arch architecture / room ) hoạt động với các lớp nội tuyến của Kotlin như được mô tả trong bài viết của Jake Whartons Các lớp nội tuyến Tạo ID cơ sở dữ liệu tuyệt vời :

@Entity
data class MyEntity(
    @PrimaryKey val id: ID,
    val title: String
)

inline class ID(val value: String)

Khi biên dịch Phòng này phàn nàn rằng

Các thực thể và Pojos phải có một nhà xây dựng công cộng có thể sử dụng. Bạn có thể có một hàm tạo trống hoặc hàm tạo có tham số khớp với các trường (theo tên và loại).

Nhìn vào mã Java được tạo, tôi thấy:

private MyEntity(String id, String title) {
      this.id = id;
      this.title = title;
}

// $FF: synthetic method
public MyEntity(String id, String title, DefaultConstructorMarker $constructor_marker) {
      this(id, title);
}

Bí ẩn các nhà xây dựng mặc định là riêng tư bây giờ.

Khi sử dụng Stringlàm kiểu cho id(hoặc a typealias), hàm tạo của lớp Java được tạo trông giống như mong đợi:

public MyEntity(@NotNull String id, @NotNull String title) {
  Intrinsics.checkParameterIsNotNull(id, "id");
  Intrinsics.checkParameterIsNotNull(title, "title");
  super();
  this.id = id;
  this.title = title;
}

Bây giờ có ai đó làm thế nào để giữ cho hàm tạo mặc định công khai trong khi sử dụng Lớp nội tuyến làm thuộc tính thực thể dữ liệu không?


Bạn đã phát sinh một vấn đề cho điều này trên một số theo dõi vấn đề? Tôi đoán điều này cần phải được làm rõ cho chắc chắn
K.Os

Câu trả lời:


0

Tôi tin rằng lý do là lớp ID sẽ được biểu diễn dưới dạng Chuỗi trong thời gian chạy. Vì vậy, tham số bổ sung $ constructor_marker là để đảm bảo tính duy nhất của chữ ký hàm tạo MyEntity (String id, String title), vì hàm tạo này có thể đã được xác định. Nhưng tôi chỉ đang suy đoán ở đây.

Bạn có thể thử định nghĩa rõ ràng hàm tạo này trong lớp MyEntity và xem nó có hoạt động không?


Hàm tạo này đã được xác định rõ ràng (nhưng có đường cú pháp) trongdata class MyEntity(@PrimaryKey val id: ID, val title: String)
whlk

Bạn đã định nghĩa một hàm tạo với các tham số (ID, Chuỗi), ý tôi là một hàm tạo với (Chuỗi, Chuỗi). Tôi đã thử, nhưng có vẻ như điều đó là không thể. Tôi gặp lỗi "Xung đột khai báo nền tảng".
Diego Marin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.