web-dev-qa-db-ja.com

Android Room:クエリの各バインド変数には一致するメソッドが必要です

私はAndroid persistence library Room with kotlinを使用しています。

ダオはこんな感じ

@Dao
interface CountryDao {
    @Query("SELECT * FROM countries")
    fun loadAllCountried() : LiveData<List<CountryEntity>>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertAll(products: List<CountryEntity>)

    @Query("SELECT * FROM countries WHERE id = :countryId")
    fun loadCountry(countryId: Int): LiveData<CountryEntity>

    @Query("SELECT * FROM countries WHERE id = :countryId")
    fun loadCountrySync(countryId: Int): CountryEntity

}

私には良いようですが、このエラーが発生しています

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

パラメーターの名前はcountryIdであることがわかりますが、問題は何ですか?

参考:CountryDao_Impl.Javaの生成コードは次のとおりです。

@Override
public CountryEntity loadCountrySync(int arg0) {
  final String _sql = "SELECT * FROM countries WHERE id = ?";
  final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 1);
  int _argIndex = 1;
  final Cursor _cursor = __db.query(_statement);
  try {
    final int _cursorIndexOfId = _cursor.getColumnIndexOrThrow("id");
    final int _cursorIndexOfPopulation = _cursor.getColumnIndexOrThrow("population");
    final CountryEntity _result;
   if(_cursor.moveToFirst()) {
     _result = new CountryEntity();
      final int _tmpId;
      _tmpId = _cursor.getInt(_cursorIndexOfId);
      _result.setId(_tmpId);
      final long _tmpPopulation;
      _tmpPopulation = _cursor.getLong(_cursorIndexOfPopulation);
      _result.setPopulation(_tmpPopulation);
    } else {
      _result = null;
    }
    return _result;
  } finally {
    _cursor.close();
    _statement.release();
  }
}

このメソッドでは、arg0はメソッドのどこでも使用されていません。

編集:これは新しいプラグインで修正されているようです。ここでの回答のいくつかは正しいですが、すべての回答を受け入れることはできません、申し訳ありません。

29
Gaurav Vashisth

Kotlinは引数の名前を適切に保持していません-これは https://youtrack.jetbrains.com/issue/KT-17959 です

この問題を回避するには、:arg0:arg1など、@ Queryステートメントのパラメーター名として:

@Query("SELECT * FROM countries WHERE id = :arg0")
fun loadCountry(countryId: Int): LiveData<CountryEntity>

@Query("SELECT * FROM countries WHERE id = :arg0")
fun loadCountrySync(countryId: Int): CountryEntity
62
Tom Insam

私のプロジェクトのkotlin v.1.2.10以降では、次の方法でのみ機能します:

@Query("select * from user where pk = :userId")
fun findUserById(userId: Long): DBUser

クエリ内の名前 ":userId"とメソッド内の "serId"は同じでなければなりません。

6

このエラーは、build.gradleファイルにapply plugin: 'kotlin-kapt'が定義されていない場合に発生します。 kaptプラグインを有効にすると、コンパイラーはバインディングパラメーターとメソッド引数を期待どおりに一致させます。

6
Clocker

この問題は、1.1.3-eap-85およびkotlin-kaptを使用して修正できます。 公式ツイート

1
Anton Kazakov

アントン・カザコフ は、このバグはkotlinプラグイン1.1.3-eap-85

しかし、まだ公開されていないので、jcenterではなく、privetリポジトリからダウンロードする必要があります

したがって、build.gradleにこの行を追加する必要があります

 maven { url 'https://dl.bintray.com/kotlin/kotlin-dev' }

buildscript {
    ext {
        kotlin_version = '1.1.3-eap-85'
    }

    repositories {
        google()
        jcenter()
        maven { url 'https://dl.bintray.com/kotlin/kotlin-dev' }
    }
    dependencies {
        classpath 'com.Android.tools.build:gradle:3.0.0-alpha7'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        mavenCentral()
        maven { url 'https://dl.bintray.com/kotlin/kotlin-dev' }
    }
}
0
humazed

この問題は、部屋1.1.0-alpha3で修正されました。

この問題に関する詳細情報はこちら:

https://issuetracker.google.com/issues/68118746

0
wangjunjie

Kotlin-gradle-plugin:1.1.3で修正されたようです

0