Intereting Posts
Как запустить Kotlin Koans в IntelliJ? Что такое «Основной класс»? NoClassDefFoundError для класса Kotlin в тесте JUnit во время выполнения Неверное текстовое изображение IllegalStateException не имеет значения для Kotlin Есть ли простой способ получить объект by _id в Котлине? Как сбросить содержимое просмотра ресайклера при вызове с помощью Kotlin Что означает тип возврата Void в Котлине Android: дублирование фрагментов в FragmentManager Сообщает ли журнал журнала журнала anko в сборке отладки или подписанной сборки Локальная система управления пакетами Java в стиле PIPON PIP? Firebase Firestore Android не может десериализовать объект Как упаковать родную библиотеку kotlin, чтобы ее можно было использовать в проектах Android и iOS? Не вызывайте setOnClickListener для AdapterView Как инициализировать представление в классе фрагментов в котлин? Как правильно показать прогресс асинхронных задач, используемых Google Room Почему в Котлине был удален индексный цикл?

Экспериментальная реализация с сохранением пространства в Котлине (ошибка Gradle)

Я внедряю функцию persistence vst в kotlin для моей реализации базы данных. Тот же вопрос задается в библиотеке Android Persistence и в потоке Kotlin , применяя это решение, приводит к различным ошибкам градиента:

Ниже приведены классы Entity , Dao и 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; } } } 

И когда я запускаю следующий код для создания базы данных:

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

Это дает мне следующее исключение:

 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) 

Кто-нибудь выполнял настойчивость в пространстве в котлин?

отредактированный

Мой предыдущий вопрос по той же теме был отмечен дубликатом этого . Хотя постановка задачи та же, но решение не решает мою проблему. Решение говорит, что я должен добавить replace annotationProcessor в kapt "android.arch.persistence.room:compiler:1.0.0-alpha1" . Я сделал эти изменения, и это привело к ошибке градиента при сборке проекта.

 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) occurred while processing annotations. Please see the error messages above. Error:Execution failed for task ':app:kaptDebugKotlin'. > Compilation error. See log for more details Information:BUILD FAILED in 10s Information:2 errors Information:2 warnings Information:See complete output in console 

Я также прикрепляю свой файл gradle:

 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() } 

Кто-нибудь сталкивался с этой проблемой?

Немного помолчав головой, я подошел к решению.

Это было действительно сложно, так как нет официального учебника, блога и т. Д., Чтобы помочь с этой проблемой на данный момент.

Я должен был сделать несколько хитов и пробных версий для всех комбинаций плагинов и зависимостей градиентов, поскольку я знал, что что-то не так с конфигурацией gradle.

Перейдем к решению:

Мне пришлось удалить apply plugin: 'kotlin-kapt' из файла build.gradle (: module) и заменить annotationProcessor "android.arch.persistence.room:compiler:1.0.0-alpha1" для kapt "android.arch.persistence.room:compiler:1.0.0-alpha1" .

Это конфигурация градиента для успешной компиляции кода.

Но есть еще кое-что для проверки. Вы должны инициализировать свойства вашего @Entity class отличие от java, указанного в документе Room Persistence lib doc . Хотя есть установщик геттера, но не упоминается о создании конструктора с инициализацией. Поэтому мне пришлось изменить класс @Entity следующим образом:

 @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 } 

Теперь для TypeConverts, в отличие от java, вам нужно создать нормальную функцию, а не статические функции (объект-компаньон):

 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)}" } } 

Я добавляю файл build.gradle, чтобы сделать его более понятным:

build.gradle (: проект)

 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 (Модуль)

 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() } 

Я думаю, что это все, я сделал, чтобы сделать мой код ворком.

Надеюсь, это тоже поможет кому-то еще.

человек просто добавляет следующее в build.gradle. Над зависимостями: D

  kapt { generateStubs = true }