Implementación de lib persistencia de habitación en Kotlin (error de Gradle)

Estoy implementando Room persistence lib en kotlin para la implementación de mi database. Se hace la misma pregunta en la biblioteca de aplicaciones de Android Room y en el hilo de Kotlin , al aplicar esas soluciones se producen diferentes errores de gradle:

Las siguientes son mis classs de Entity , Dao y Database :

Food.kt

 @Entity class Food(@ColumnInfo(name = "food_name") var foodName: String, @ColumnInfo(name = "food_desc") var foodDesc: String, @ColumnInfo(name = "protein") var protein: Double, @ColumnInfo(name = "carbs") var carbs: Double, @ColumnInfo(name = "fat") var fat: Double) { @ColumnInfo(name = "id") @PrimaryKey(autoGenerate = true) var id: Long = 0 @ColumnInfo(name = "calories") var calories: Double = 0.toDouble() } 

PersonalizedFood.kt

 @Entity(primaryKeys = arrayOf("food_id","date")) class PersonalizedFood(@ColumnInfo(name = "quantity") var quantity: Int, @ColumnInfo(name = "unit") var unit: String, @ColumnInfo(name = "date") var date: Date){ @ColumnInfo(name = "food_id") var foodId:Long = 0 } 

FoodDao.kt

 @Dao interface FoodDao { companion object{ const val ID = "id" const val NAME = "name" const val PROTEIN = "protein" const val DESC = "desc" const val CARBS = "carbs" const val FAT = "fat" const val DATE = "date" const val FOOD_ID = "food_id" const val ALL_FOOD_LIST = "food" const val PERSONALISED_FOOD_LIST = "personalised_food" } /** * Returns food details of a food given by food_id */ @Query("SELECT * FROM $ALL_FOOD_LIST WHERE $ID=:food_id") fun getFoodDetails(food_id:Long):Food /** * Inserts food items in all_food_list */ @Insert fun addFoodList(list:ArrayList<Food>) @Insert(onConflict = REPLACE) fun saveFood(food:PersonalizedFood) @Query("SELECT * FROM $PERSONALISED_FOOD_LIST WHERE $FOOD_ID=:foodId and $DATE=:date") fun getFood(foodId:Int, data:Date):PersonalizedFood @Query("SELECT * FROM $ALL_FOOD_LIST where $ID in (select $FOOD_ID from $PERSONALISED_FOOD_LIST where $DATE = :date)") fun getFood(date:Date):ArrayList<Food> } 

Converter.kt

 class Converter { companion object{ @TypeConverter fun fromTimestamp(value: Long?): Date? { return if (value == null) null else Date(value) } @TypeConverter fun dateToTimestamp(date: Date): Long { return date.time } } } 

FoodDatabase.kt

 @Database(entities = arrayOf(Food::class, PersonalizedFood::class), version = 1) @TypeConverters(Converter::class) abstract class FoodDatabase : RoomDatabase(){ abstract fun foodDao():FoodDao companion object{ private val databaseName = "diet" var dbInstance:FoodDao? = null fun getInstance(context:Context):FoodDao?{ if(dbInstance == null) dbInstance = Room.inMemoryDatabaseBuilder(context, FoodDatabase::class.java).build().foodDao() return dbInstance; } } } 

Y cuando ejecuto el siguiente código para crear una database:

FoodDatabase.getInstance(baseContext)?.getFood(Calendar.getInstance().time)

Me da la siguiente exception:

 Caused by: java.lang.RuntimeException: cannot find implementation for com.chandilsachin.diettracker.database.FoodDatabase. FoodDatabase_Impl does not exist at android.arch.persistence.room.Room.getGeneratedImplementation(Room.java:90) at android.arch.persistence.room.RoomDatabase$Builder.build(RoomDatabase.java:340) at com.chandilsachin.diettracker.database.FoodDatabase$Companion.getInstance(FoodDatabase.kt:21) at com.chandilsachin.diettracker.MainActivity$SetUpFoodDatabase.doInBackground(MainActivity.kt:95) at com.chandilsachin.diettracker.MainActivity$SetUpFoodDatabase.doInBackground(MainActivity.kt:77) at android.os.AsyncTask$2.call(AsyncTask.java:295) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818) 

¿Alguien ha implementado persistencia de habitación en kotlin?

Editado

Mi pregunta anterior sobre el mismo tema fue marcada duplicada de esto . Aunque el enunciado del problema es el mismo, la solución dada no resuelve mi problema. La solución dice que kapt "android.arch.persistence.room:compiler:1.0.0-alpha1" agregar replace kapt "android.arch.persistence.room:compiler:1.0.0-alpha1" a la kapt "android.arch.persistence.room:compiler:1.0.0-alpha1" de kapt "android.arch.persistence.room:compiler:1.0.0-alpha1" . Hice esos cambios y resultó en error de gradle durante la compilation del proyecto.

 Information:Gradle tasks [:app:assembleDebug] Warning:warning: Supported source version 'RELEASE_7' from annotation processor 'android.arch.persistence.room.RoomProcessor' less than -source '1.8' Warning:warning: The following options were not recognized by any processor: '[kapt.kotlin.generated]' /Users/BBI-M1025/Documents/BBI/Workspace_fun/Android/diet-tracker/app/src/main/java/com/chandilsachin/diettracker/database/Food.kt Error:(1, 1) Some error(s) occurnetworking while processing annotations. Please see the error messages above. Error:Execution failed for task ':app:kaptDebugKotlin'. > Comstacktion error. See log for more details Information:BUILD FAILED in 10s Information:2 errors Information:2 warnings Information:See complete output in console 

Adjunto mi file gradle también:

 apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.chandilsachin.diettracker" minSdkVersion 16 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" compile 'com.android.support:appcompat-v7:25.0.1' compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha8' compile 'com.android.support:cardview-v7:25.0.1' compile 'com.android.support:recyclerview-v7:25.0.1' compile 'com.github.ne1c:rainbowmvp:1.2.1' compile "org.jetbrains.anko:anko-commons:0.10.0" /*annotationProcessor "android.arch.persistence.room:compiler:1.0.0-alpha1" compile "android.arch.lifecycle:extensions:1.0.0-alpha1" annotationProcessor "android.arch.lifecycle:compiler:1.0.0-alpha1"*/ 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" testCompile 'junit:junit:4.12' } repositories { mavenCentral() } 

¿Alguien ha encontrado este problema?

Después de girar la cabeza por un time con este problema, encontré la solución.

Fue realmente difícil ya que no existe un tutorial, blog, etc. oficial para ayudar con este problema a partir de ahora.

Tuve que hacer varias testings y probar todas las combinaciones de complementos y dependencies de Gradle, ya que sabía que algo andaba mal con la configuration de Gradle.

Vamos a llegar a la solución:

Tuve que eliminar el apply plugin: 'kotlin-kapt' del file build.gradle (: module) y replace annotationProcessor "android.arch.persistence.room:compiler:1.0.0-alpha1" por kapt "android.arch.persistence.room:compiler:1.0.0-alpha1" .

Esta es la configuration de Gradle para comstackr correctamente el código.

Pero hay más cosas para verificar. Tienes que inicializar las properties de tu @Entity class diferencia de java en Room Persistence lib doc . Aunque hay un setter getter pero no se menciona para crear un constructor con initialization. Así que tuve que cambiar mi class @Entity con esto:

 @Entity(tableName = "all_food_list") class Food (@ColumnInfo(name = "food_name") var foodName: String = "", @ColumnInfo(name = "food_desc") var foodDesc: String = "", @ColumnInfo(name = "protein") var protein: Double = 0.0, @ColumnInfo(name = "carbs") var carbs: Double = 0.0, @ColumnInfo(name = "fat") var fat: Double = 0.0, @ColumnInfo(name = "calories") var calories: Double = 0.0) { @ColumnInfo(name = "id") @PrimaryKey(autoGenerate = true) var id: Long = 0 } 

Ahora para TypeConverts, a diferencia de java, necesita crear funciones normales y no estáticas (object complementario):

 class Converters{ @TypeConverter fun fromTimestamp(value: String): Calendar { val arr = value.split("-") val cal = Calendar.getInstance() cal.set(arr[0].toInt(), arr[1].toInt(), arr[2].toInt()) return cal } @TypeConverter fun dateToTimestamp(date: Calendar): String { return "${date.get(Calendar.DATE)}-${date.get(Calendar.MONTH)+1}-${date.get(Calendar.YEAR)}" } } 

Estoy agregando el file build.gradle también para hacerlo más claro:

build.gradle (: proyecto)

 buildscript { ext.kotlin_version = '1.1.2-4' ext.gradle_version_stable = '2.3.2' ext.gradle_version_preview = '3.0.0-alpha1' ext.anko_version = '0.10.0' repositories { maven { url 'https://maven.google.com' } jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.0.0-alpha1' 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 { maven { url 'https://maven.google.com' } jcenter() maven { url "https://jitpack.io" } } } task clean(type: Delete) { delete rootProject.buildDir } 

build.gradle (: module)

 apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.chandilsachin.diettracker" minSdkVersion 16 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" ... ... // room persistence dependency compile "android.arch.persistence.room:runtime:1.0.0-alpha1" kapt "android.arch.persistence.room:compiler:1.0.0-alpha1" testCompile 'junit:junit:4.12' } repositories { mavenCentral() } 

Creo que esto es todo, lo hice para hacer que mi código funcionara.

Espero que esto ayude a alguien más también.

hombre solo agrega lo siguiente en build.gradle. Por encima de las dependencies: D

  kapt { generateStubs = true } 
  • ¿Por qué esta aplicación Spring Boot no puede encontrar la página principal?
  • Usando la cláusula Kotlin WHEN para <, <=,> =,> comparaciones
  • En la dependency injection Kodein, ¿cómo se puede inyectar instancias de Kodein en instancias?
  • ¿Cómo organizar files de resources de layout en Android Studio?
  • Kotlin VS Scala: Implementar methods con parameters constructor primarios
  • Kotlin Constructor Crash
  • Desadaptación del tipo de Kotlin: ¡tipo inferido es Ver! pero se esperaba TextView
  • Orden de datos de spring por function de Java
  • Más diversión con los delegates de Kotlin
  • Cómo convertir cadena a char en Kotlin?
  • El receptor de difusión onReceive () no se llama