Я перехожу к использованию Room, и у меня возникла проблема с блокировкой. Я выполнил и исправил все проверки времени компиляции из библиотеки Room, но теперь сталкиваюсь со следующей ошибкой:
Entities and Pojos must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type).
Это появляется дважды во время компиляции без каких-либо доказательств того, из какого класса это происходит, но я смог выяснить (удалив классы из базы данных), что это был один из файлов. Я предполагаю, что это как-то связано с тем, что первичный ключ является строкой, а не Int (это один из двух классов, которые его используют), но ничто в документации не указывает, в чем может быть проблема, и на самом деле документация показывает эти строки являются действительными первичными ключами.
@Entity(tableName = "inspections")
data class Inspection(
@SerializedName("id")
var id: Int = 0,
...
// Rest of code left off for brevity, found to not be related to the issue.
Я пробовал несколько вещей, чтобы обойти это.
- Удалите атрибут данных этого класса, чтобы сделать его обычным POKO.
- Удалите переменные из конструктора по умолчанию и поместите их в класс
- Удалите Ignore из пустого конструктора (обратите внимание, это вызывает другую проблему,
Room cannot pick a constructor since multiple constructors are suitable
- аннотация Ignore в конструкторе по умолчанию обходит это.) Это часть, которая меня больше всего смущает - удаление этого говорит, что "несколько конструкторов действительны", в нем говорится, что "конструкторы не действительны".
Обновлено: добавлено еще несколько релевантных фрагментов кода из моего проекта.
build.gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
.....
implementation 'android.arch.persistence.room:runtime:1.0.0-alpha9-1'
implementation 'android.arch.persistence.room:rxjava2:1.0.0-alpha9-1'
kapt 'android.arch.persistence.room:compiler:1.0.0-alpha9-1'
Класс базы данных
@Database(entities =
arrayOf(Account::class, Category::class,
Inspection::class, InspectionForm::class,
InspectionFormItem::class, InspectionFormsStructure::class,
InspectionItemPhoto::class,
InspectionItem::class, LineItem::class,
LocalPhoto::class, Rating::class,
Structure::class, SupervisoryZone::class,
Upload::class, User::class),
version = 16)
@TypeConverters(Converters::class)
abstract class OrangeDatabase : RoomDatabase() {
abstract fun inspectionDao(): InspectionDao
abstract fun localDao(): LocalDao
abstract fun ratingsDao(): RatingsDao
abstract fun structureZoneDao(): StructureZoneDao
abstract fun userAccountDao(): UserAccountDao
}
Конвертеры
class Converters {
@TypeConverter
fun fromTimestamp(value: Long?): Date? {
return if (value == null) Date() else Date(value)
}
@TypeConverter
fun dateToTimestamp(date: Date?): Long? {
return date?.time ?: 0
}
@TypeConverter
fun fromStringToArray(value: String?): Array<String>? {
return value?.split(",")?.toTypedArray() ?: arrayOf()
}
@TypeConverter
fun stringToStringArray(strings: Array<String>?): String? {
return strings?.joinToString(",") ?: ""
}
}
Другой класс данных
@Entity(tableName = "users")
data class User(
@PrimaryKey
@SerializedName("id")
var id: Int = 0,
...
// Rest of code left off for brevity, found to not be related to the issue.
UserPermissions класс:
data class UserPermissions(
@SerializedName("id")
var pid: Int = 0,
...
// Rest of code left off for brevity, found to not be related to the issue.