#android #android-gradle-plugin #android-room #androidx
#Android #android-gradle-plugin #android-комната #androidx
Вопрос:
Я продолжаю получать эту ошибку. Я работаю над проектом и в середине разработки решил перейти на Android X.
Я получаю сообщение об ошибке ниже:
Note: Failed to read get kotlin metadata for [Ljava.lang.Object;@79d6c4df
Такая же ошибка в файле объекта и 4 таких же ошибки в соответствующем DAO.
Вот код DAO:
@Dao
public interface FlockDao{
@Query("SELECT * FROM flock_table")
LiveData<List<Flock>> getAllFlocks();
@Query("SELECT * FROM flock_table WHERE fid IN (:flockIds) LIMIT 1")
Flock loadFlockById(int[] flockIds);
@Insert
void insert(Flock flock);
@Update
void update(Flock flock);
@Delete
void delete(Flock flock);
}
И моя сущность:
@Entity
public class Flock{
@PrimaryKey(autoGenerate = true)
private int fid;
@ColumnInfo(name = "user_id")
private int uid;
@ColumnInfo(name = "name")
private String name;
@ColumnInfo(name = "capacity")
private int capacity;
@ColumnInfo(name = "type")
private String type;
@ColumnInfo(name = "arrived")
private Date arrived;
.....rest of the code is omitted, there are constructor, setters and getters
}
Комментарии:
1. По-видимому, тип данных Date не поддерживается room. Так что это вызывает проблему.
2. Разве стандартные
@TypeConverter
классы не должны обрабатывать преобразованиеDate
вLong
?3. вы нашли какое-либо решение? @dawn
4. Я понизил рейтинг зависимости, как указано в некоторых ответах, и удалил поле типа даты и вместо этого использовал строку. @RushDroid
Ответ №1:
Я обновил свой номер depency до 2.1.0-alpha05 и столкнулся с той же проблемой. Возврат к 2.1.0-alpha04 решил мою проблему.
implementation 'androidx.room:room-runtime:2.1.0-alpha04'
annotationProcessor 'androidx.room:room-compiler:2.1.0-alpha04'
Обновить
Если вы действительно хотите использовать Room версии 2.1.0-alpha05, добавьте следующую зависимость в репозиторий вашего проекта:
maven { url 'https://kotlin.bintray.com/kotlinx/' }
Ссылка: Примечания к выпуску AndroidX Room
ОБНОВИТЬ Я попробовал 2.1.0-alpha06.
implementation 'androidx.room:room-runtime:2.1.0-alpha06'
annotationProcessor 'androidx.room:room-compiler:2.1.0-alpha06'
Затем я добавляю depency в репозиторий моего проекта,
maven { url 'https://kotlin.bintray.com/kotlinx/' }
Произошла ошибка na, но она скомпилировалась. Я тестировал свое приложение на реальном устройстве в течение нескольких недель, и при запуске моего приложения не было никаких проблем. Моя база данных комнат работает нормально.
Комментарии:
1. Я использую 2.1.0-alpha05 и правильно настроил URL maven. Я попробую использовать 2.1.0-alpha04. Спасибо за ваш ответ.
2. По-прежнему не удалось заставить работать alpha05 ни alpha06. Понижение до alpha04 работает!
3. Это сработало! Я думаю, что нет необходимости добавлять это для alpha04. maven { url ‘ kotlin.bintray.com/kotlinx ‘ }
4. не имеет никакого значения даже после добавления maven { url ‘ kotlin.bintray.com/kotlinx ‘ }
Ответ №2:
Я решил эту проблему, понизив рейтинг до:
implementation 'androidx.room:room-runtime:2.1.0-alpha04'
annotationProcessor 'androidx.room:room-compiler:2.1.0-alpha04'
Ответ №3:
Решено!
//Downgraded to alpha04.
implementation 'androidx.room:room-runtime:2.1.0-alpha04'
annotationProcessor 'androidx.room:room-compiler:2.1.0-alpha04'
// Other dependencies are..
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0-alpha03'
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.1.0-alpha03'
implementation 'androidx.lifecycle:lifecycle-livedata:2.1.0-alpha03'
annotationProcessor 'androidx.lifecycle:lifecycle-compiler:2.1.0-alpha03'
// Removed this from project level gradle.
maven { url "https://kotlin.bintray.com/kotlinx/" }
Не забудьте очистить и перестроить проект после этих изменений
Ответ №4:
Как и большинство ошибок, которые имеют какое-то отношение к Room, сообщение об ошибке, которое появляется чаще всего, вряд ли является вашей проблемой. Для меня это помогло увеличить максимальное количество ошибок, добавив :
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xmaxerrs" << "1000"
}
}
и затем выполнить задачу gradle:
:app compileDebugJavaWithJavac
Затем вы получите большой список ошибок, в вашем случае
Note: Failed to read get kotlin metadata for [Ljava.lang.Object;@79d6c4df
Но где-то в этом списке есть ваши реальные ошибки, такие как неправильный запрос или что-то в этом роде.
Исправьте эти ошибки и перестройте проект, что работает большую часть времени, но иногда вам приходится аннулировать кеш и перезапускать Android Studio.
Комментарии:
1. Вы хотите сказать, что фактические ошибки в данный момент не отображаются? Каково значение Xmaxerrs по умолчанию?
2. По крайней мере, для меня это было проблемой, и где-то посередине была информация о том, что один столбец запроса не соответствует объекту. Я думаю, что значение по умолчанию равно 100 ошибкам.
3. Я сделал это, но все еще не смог увидеть никаких ошибок, которые я понимаю. @glm9637
4. попробуйте выполнить поиск в консоли с помощью этого регулярного выражения:
^((?!(class|Databinding|Note: failed|^)).)*$
оно должно отмечать те ошибки, которые не имеют ничего общего с Kotlin или любыми неинтересными ошибками привязки данных @dawn
Ответ №5:
Аннулирование кэшей и перезапуск решили мою проблему. Версия моей комнаты 2.1.0-alpha06, и я также добавил следующую зависимость в репозиторий моего проекта:
maven { url 'https://kotlin.bintray.com/kotlinx/' }
Ответ №6:
Я получил ту же ошибку, я обновил библиотеки комнат, но проблема не устранена, затем я выполнил следующие шаги, … после того, как эта проблема решена,
Шаг 1: Проверьте @DataBase class в вашем проекте и убедитесь, что все таблицы (сущности) вставлены
Шаг 2: Увеличьте номер версии
Шаг 3: Добавьте «.fallbackToDestructiveMigration()» перед .build().
Не забудьте очистить и перестроить проект после этих изменений
Ответ №7:
Когда я печатал этот ответ, я был уведомлен об 2.1.0-alpha07
. Это устранило все ошибки. Возврат к 2.1.0-alpha06
снова прервал сборку.
Оказывается, новая версия исправила ошибки для меня.
Прежде чем пытаться устранить ошибку, попробуйте сначала обновить Android Studio. После обновления Gradle, всех зависимостей и НАЧИНАЯ с 3.3.2- 3.4, я обнаружил ошибки, с которыми раньше не сталкивался, например
error: Room cannot pick a constructor since multiple constructors are suitable. Try to annotate unwanted constructors with @Ignore.
error: Cannot find setter for field.
There are multiple good constructors and Room will pick the no-arg constructor. You can use the @Ignore annotation to eliminate unwanted constructors.
error: Not sure how to convert a Cursor to this method's return type.
Как только я их исправил, сборка прошла успешно, и приложение запустилось. Мне не нужно было добавлять какие-либо дополнительные репозитории maven, упомянутые в принятом ответе.
Ответ №8:
Добавление import androidx.room.Dao;
и затем повторный импорт этого сделали свое дело для меня.
Ответ №9:
Я решил, добавив это в build.gradle (модуль)
androidTestImplementation "androidx.arch.core:coretesting:$rootProject.archLifecycleVersion"
В моем build.gradle (проекте)
ext {
roomVersion = '2.1.0-alpha06'
archLifecycleVersion = '2.0.0'
}
Ответ №10:
Просто измените room_version в вашем файле gradle_module в блоке зависимостей и измените другие библиотеки, связанные с комнатой, которые вам нужны. Использовать https://developer.android.com/jetpack/androidx/releases/room#2.2.0-alpha01 в качестве примера. Попробуйте использовать последнюю стабильную версию room.
Ответ №11:
У меня та же ошибка, и я использовал версию 2.1.x-alpha, и после обновления до 2.2.3 новая версия правильно сообщила об ошибке, и это было то, что у одного из моих объектов не было первичного ключа
Ответ №12:
Я столкнулся с той же проблемой и исправил ее, переопределив методы equals и hashCode объекта.
Возможное решение для вашего случая:
@Override
public int hashCode() { return (27 * fid (name!= null ? name.hashCode() : 0)); }
И
@Override
public boolean equals(@Nullable Object obj) {
if (this == obj) return true;
if (!(obj instanceof Flock)) return false;
Flock flock = (Flock) obj;
if(fid != flock.fid) return false;
return name != null ? name.equals(flock.name) : flock.name == null;
}
вам также нужно будет найти решение для использования даты в Room, у Room нет встроенного решения для переменной Date.
Комментарии:
1. Добавление конструктора по умолчанию также может помочь. общедоступный Flock() {}
2. Конструктор по умолчанию не решает проблему. Томас.