私は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はメソッドのどこでも使用されていません。
編集:これは新しいプラグインで修正されているようです。ここでの回答のいくつかは正しいですが、すべての回答を受け入れることはできません、申し訳ありません。
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
私のプロジェクトのkotlin v.1.2.10以降では、次の方法でのみ機能します:
@Query("select * from user where pk = :userId")
fun findUserById(userId: Long): DBUser
クエリ内の名前 ":userId"とメソッド内の "serId"は同じでなければなりません。
このエラーは、build.gradleファイルにapply plugin: 'kotlin-kapt'
が定義されていない場合に発生します。 kaptプラグインを有効にすると、コンパイラーはバインディングパラメーターとメソッド引数を期待どおりに一致させます。
この問題は、1.1.3-eap-85およびkotlin-kaptを使用して修正できます。 公式ツイート
アントン・カザコフ は、このバグは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' }
}
}
Kotlin-gradle-plugin:1.1.3で修正されたようです