¿Cuál es la forma oficial / correcta de crear la entidad y el file Dao al usar kotlin?

tratando de usar la habitación con kotlin, no encontrar el documento oficial. Aquí hay algunos hallazgos de los fallos.

lo hizo funcionar para casos simples, pero todavía no estoy seguro si es el path correcto, así que publíquelo aquí y espero que alguien conozca la oficina / la forma correcta de hacerlo con kotlin?

Tengo dos problemas, el primero: cuando se define la entidad, se tiene que poner en el constructor y, si no, se comstackrá pero no se generará el xx_impl.java, como:

@Entity(name = "user") class User { @ColumnInfo(name = "id") @PrimaryKey var id: String? = null @ColumnInfo(name = "name") var name: String? = null @ColumnInfo(name = "lastName") var lastName: String? = null @ColumnInfo(name = "age") var age: Int = 0 } 

pero si se pone en constructor

 @Entity(tableName = "post") class DbPost ( @ColumnInfo(name = "title") var title: String? = null, @ColumnInfo(name = "authorId") var authorId: Int? = null, @ColumnInfo(name = "date") var date: String? = null, ) { @ColumnInfo(name = "id") @PrimaryKey(autoGenerate=true) var id: Int? = null } 

generará el xxx_impl.java (nota, para versiones de habitaciones diferentes, alguien requiere que los campos sean inicializados, en alguna versión, el último no puede tener el valor pnetworkingeterminado, y en alguna versión todos los parameters pueden ser sin valor de initialization, ¿alguien sabe? cuál es la forma correcta de que funcione para todas las versiones, tal vez la última versión uno).

Otro problema es cuando la consulta tiene params, el comstackdor parece que pondrá su propio nombre en el file xx_impl.java generado (hace que no sepas qué poner en el código hasta después de que genere el xx_impl.java), en diferentes kotlin versión es diferente.

1. en una calificación de proyecto tiene un complemento de aplicación: 'kotlin-kapt'

y con kotlin_version = '1.1.2-4'

 compile "android.arch.persistence.room:runtime:$rootProject.versions.arch_comp" kapt "android.arch.persistence.room:compiler:1.0.0-alpha1" @Query("select * from post where id = :id”) fun findPostById(id: Long): DbPost error: Each bind variable in the query must have a matching method parameter. Cannot find method parameters for :arg0. e: e: public abstract com.manijshrestha.todolist.data.DbPost findPostById(long p0); ^ 

allí generado xxx_impl.java ha utilizado p0

 @Override public DbPost findPostById(long p0) { final String _sql = "select * from post where id = ?"; final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 1); int _argIndex = 1; _statement.bindLong(_argIndex, p0); 

2. en otro entorno de proyecto con kotlin_version = '1.1.3-2'

 compile "android.arch.persistence.room:runtime:1.0.0-alpha1" annotationProcessor "android.arch.persistence.room:compiler:1.0.0-alpha1" kapt "android.arch.persistence.room:compiler:1.0.0-alpha1" 

(nota: si no tiene kapt "android.arch.persistence.room:compiler:1.0.0-alpha1", no generará el file xxx_impl.java)

cuando en el file xxDao pon el param de consulta con ': p0'

 @Query("select * from post where id = :p0") fun loadPostById(id: Int): DbPost 

se queja:

 error: Each bind variable in the query must have a matching method parameter. Cannot find method parameters for :p0. error: Unused parameter: arg0 

allí generado xxx_impl.java utilizó arg0

 @Override public DbPost loadPostById(int arg0) { final String _sql = "select * from post where id = ?"; final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 1); int _argIndex = 1; _statement.bindLong(_argIndex, arg0); 

Las properties en la class @Entity deben agregar en el constructor ya que también es una forma pnetworkingeterminada y sugerida de crear e inicializar properties en Kotlin . De esta manera puede asegurarse de que su código de lib de la sala funcione en cada versión. (Lo he usado y probado en todos los lanzamientos ya que Kotlin es el idioma oficial de Android)).

Para los methods @Query en la class DAO, los parameters deben usarse como: arg0, arg1,..., argN .

 @Query("select * from post where id = :arg0 and name like :arg1”) fun findPostByIdName(id: Long, name: String): DbPost 

El uso de methods @Query esta forma evitará que Each bind variable in the query must have a matching method parameter. Cannot find method parameters for :p0. Each bind variable in the query must have a matching method parameter. Cannot find method parameters for :p0. error.

Kotlin acaba de lanzar su 1.1.4 el 15 de agosto (hace dos días), no estoy seguro de si se permiten nombres de param exactos en este lanzamiento o no.

No he usado el apply plugin: 'kotlin-kapt' en mi implementación de room-kotlin. No estaba funcionando para mí.

tener esta línea kapt "android.arch.persistence.room:compiler:1.0.0-alpha1" es necesaria porque su procesador de anotación para Room lib y sin él no hay significado de annotations (como: @Entity , @DAO etc.) utilizadas para la implementación de la sala.

Consulte este artículo: https://medium.com/@chandilsachin/room-with-unit-test-in-kotlin-4ad31a39a291

Eche un vistazo a esta pregunta de stackoverflow para tener más información: implementación de Room Persistence lib en Kotlin

Espero eso ayude.

  • Android Kotlin Dagger2 proporciona gson: el parámetro especificado como no nulo es nulo
  • Biblioteca kotlin klaxon para json
  • Diferencia entre el receptor de function y la function de extensión
  • Dagger2 + Kotlin, inyección no funciona
  • Usar Kotlin en un module de biblioteca sin usarlo en el module de la aplicación
  • Kotlin: ¿Cuál es el uso de la class sin cuerpo?
  • ¿Cómo usar los methods Spring Data JPA que devuelven un Stream en un bloque try-with-resources en Kotlin?
  • Constructores de Kotlin: primarios y secundarios
  • ¿Cómo interactúa Kotlin con Java y JavaScript?
  • ¿Por qué no se llama a OnConfigurationChanged?
  • Kotlin: Pase el object en function como reference y cambie su instancia