ฐานข้อมูลห้องที่มีคลาสอินไลน์ Kotlin เป็นฟิลด์ Entity


9

ฉันกำลังพยายามหาห้อง ( https://developer.android.com/topic/library/architecture/room ) ทำงานร่วมกับคลาสอินไลน์ของ Kotlin ตามที่อธิบายไว้ในบทความ Jake Whartons Inline Classes Make ID ฐานข้อมูลที่ยอดเยี่ยม :

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

inline class ID(val value: String)

เมื่อรวบรวมห้องนี้ก็บ่นว่า

หน่วยงานและ Pojos ต้องมีตัวสร้างสาธารณะที่ใช้งานได้ คุณสามารถมีคอนสตรัคเตอร์ว่างเปล่าหรือคอนสตรัคเตอร์ซึ่งพารามิเตอร์ตรงกับฟิลด์ (ตามชื่อและประเภท)

มองหารหัส Java ที่สร้างขึ้นฉันพบ:

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);
}

ลึกลับตัวสร้างเริ่มต้นเป็นส่วนตัวในขณะนี้

เมื่อใช้Stringเป็นชนิดสำหรับid(หรือ a typealias) ตัวสร้างคลาส Java ที่สร้างขึ้นจะมีลักษณะดังนี้:

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

ตอนนี้มีใครบางคนทำอย่างไรให้คอนสตรัคเตอร์เริ่มต้นเป็นสาธารณะในขณะที่ใช้ Inline Classes เป็นคุณสมบัติเอนทิตีข้อมูล


คุณเพิ่มปัญหาสำหรับการติดตามปัญหานี้หรือไม่? ฉันเดาว่านี่จะต้องมีการชี้แจงอย่างแน่นอน
K.Os

คำตอบ:


0

ฉันเชื่อว่าเหตุผลคือระดับ ID จะแสดงเป็น String ใน runtime ดังนั้นพารามิเตอร์เพิ่มเติม $ constructor_marker คือการรับประกันความไม่ซ้ำกันของลายเซ็นตัวสร้าง MyEntity (String id, ชื่อสตริง) ทำให้ตัวสร้างนี้ไม่สามารถกำหนดได้ แต่ฉันแค่คาดเดาที่นี่

คุณลองกำหนด constructor นี้ในคลาส MyEntity อย่างชัดเจนและดูว่ามันใช้งานได้หรือไม่


คอนสตรัคนี้ได้กำหนดไว้อย่างชัดเจนแล้ว (แต่มีน้ำตาล syntactic) ในdata class MyEntity(@PrimaryKey val id: ID, val title: String)
whlk

คุณได้กำหนดคอนสตรัคเตอร์ที่มี (ID, สตริง) พารามิเตอร์ฉันหมายถึงคอนสตรัคเตอร์ที่มี (String, String) ฉันพยายาม แต่ดูเหมือนว่ามันเป็นไปไม่ได้ ฉันได้รับข้อผิดพลาด "การประกาศแพลตฟอร์มปะทะ"
Diego Marin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.