Edited at

Android Architecture ComponentsのRoomをKotlinで使ったときのハマりポイント

More than 1 year has passed since last update.

KotlinでRoomを使おうとして個人的に盛大にハマった二つのポイントを紹介しようと思います。

同じようなエラーで苦しんでいる方の解決策になれば幸いです。


1.@Entityでのハマり


Room cannot pick a constructor since multiple constructors are suitable. Try to annotate unwanted constructors with @Ignore.

@Entityクラスでコンストラクタが複数あると上記のエラーになります。

Kotlinでプライマリコンストラクタにデフォルト値を設定しているとコンストラクタが適宜自動で生成されるので、@Entityを使うクラスでは注意です。

@Entity

class Sample(val id: Int = 0, val date: String = "")
⬇️

/*デコンパイル結果*/
public final class Sample {
// 省略

public Sample(int id, @NotNull String date) {
Intrinsics.checkParameterIsNotNull(date, "date");
super();
this.id = id;
this.date = date;
}

// $FF: synthetic method
public Sample(int var1, String var2, int var3, DefaultConstructorMarker var4) {
if((var3 & 1) != 0) {
var1 = 0;
}

if((var3 & 2) != 0) {
var2 = "";
}

this(var1, var2);
}

public Sample() {
this(0, (String)null, 3, (DefaultConstructorMarker)null);
}
}

Parcelerの@Parcelと併用するときはプライマリコンストラクタにデフォルト値をいれる以外の対策を施しましょう。


2.@Daoの@Queryでのハマり


Each bind variable in the query must have a matching method parameter. Cannot find method parameters for :______

これが一番深いハマりでした。。

ググるとこちらにいきつきました、どうやらabstract methodのパラメーターを保持できない問題のようです。

@Query("SELECT COUNT(*) FROM Article WHERE id = :id")

fun count(id: Int): Int
                       ⬇︎
/*tmp/kapt3/stubs/以下*/
@android.arch.persistence.room.Query(value = "SELECT COUNT(*) FROM Article WHERE article_id = :id")
public abstract int count(int p0); ← p0?!

すぐに修正されそうな気配はしていますが、とりあえずはp0を使うと回避できます。。笑

@Query("SELECT COUNT(*) FROM Article WHERE id = :p0")

fun count(id: Int): Int

雑に以上です。