EntityフィールドとしてKotlinインラインクラスを使用した会議室データベース


9

私はRoom(https://developer.android.com/topic/libraries/architecture/room)を、Jake Whartonsの記事Inline Classes Make Great Database IDsに記載されているKotlinのインラインクラスと連携させようとしています:

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

inline class ID(val value: String)

このルームをコンパイルすると、

エンティティとPojoには、使用可能なパブリックコンストラクターが必要です。空のコンストラクターを持つことも、パラメーターが(名前とタイプによって)フィールドに一致するコンストラクターを持つこともできます。

私が見つけた生成された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型として使用する場合、生成されたJavaクラスコンストラクターは期待どおりに見えます。idtypealias

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

誰かが、インラインクラスをデータエンティティプロパティとして使用しながら、デフォルトのコンストラクターをパブリックに保つ方法を教えてください。


いくつかの課題トラッカーでこの問題を提起しましたか?これは確かに明確にする必要があると思います
K.Os

回答:


0

その理由は、IDクラスが実行時にStringとして表されるためだと思います。したがって、$ constructor_marker追加パラメーターは、MyEntity(String id、String title)コンストラクターシグニチャーの一意性を保証するためのものです。このコンストラクターが既に定義されている可能性があるためです。しかし、私はここで推測しているだけです。

MyEntityクラスでこのコンストラクターを明示的に定義して、それが機能するかどうかを確認できますか?


このコンストラクターは明示的に(ただし構文糖衣付きで)定義されていますdata class MyEntity(@PrimaryKey val id: ID, val title: String)
whlk

(ID、String)パラメーターを使用してコンストラクターを定義しました。つまり、(String、String)を使用してコンストラクターを定義しました。試しましたが、出来ないようです。「プラットフォーム宣言の衝突」エラーが発生しました。
ディエゴマリン、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.