LoginSignup
8
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-06-10

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

雑に以上です。

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6