注意:无法读取 [Ljava.lang.Object;@79d6c4df 的 get kotlin 元数据

Note: Failed to read get kotlin metadata for [Ljava.lang.Object;@79d6c4df

我一直收到这个错误。 我正在做一个项目,在开发过程中,我决定迁移到 Android X。

我收到以下错误:

Note: Failed to read get kotlin metadata for [Ljava.lang.Object;@79d6c4df

实体文件中有相同的错误,相应的 DAO 中也有 4 个相同的错误。

这里是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
}

我遇到了同样的问题并通过覆盖对象的 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 没有针对日期变量的内置解决方案。

添加 import androidx.room.Dao; 然后重新导入它对我有用。

我将 Room 依赖项更新为 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 Release Notes

更新 我试过 2.1.0-alpha06.

implementation 'androidx.room:room-runtime:2.1.0-alpha06'
annotationProcessor 'androidx.room:room-compiler:2.1.0-alpha06'

然后我将依赖项添加到我的项目存储库,

maven { url 'https://kotlin.bintray.com/kotlinx/' }

没有错误但是编译成功了。我在真实设备上测试了我的应用程序数周,没有任何问题 运行 我的应用程序。我的房间数据库运行良好。

与大多数与 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。

使缓存无效并重新启动解决了我的问题。我的房间版本是 2.1.0-alpha06,我还在我的项目存储库中添加了以下依赖项:

 maven { url 'https://kotlin.bintray.com/kotlinx/' }

已解决!

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

不要忘记在这些更改后清理并重建项目

我通过降级到解决了这个问题:

implementation 'androidx.room:room-runtime:2.1.0-alpha04'
annotationProcessor 'androidx.room:room-compiler:2.1.0-alpha04'

我遇到了同样的错误,我更新了房间库,但问题没有解决, 然后我做了下面的步骤,......在那个问题解决之后,

第 1 步:检查项目中的@DataBase class 并检查所有表(实体)是否已插入

第 2 步:增加版本号

第 3 步:在 .build() 之前添加“.fallbackToDestructiveMigration()”。

不要忘记在这些更改后清理并重建项目

当我输入这个答案时,我收到了 2.1.0-alpha07 的通知。它解决了所有错误。返回 2.1.0-alpha06 再次破坏了构建。

事实证明新版本为我解决了错误。


在尝试解决错误之前,请先尝试更新 Android Studio。将Gradle、所有依赖、AS从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 存储库。

我通过将此添加到 build.gradle(模块)

来解决
    androidTestImplementation "androidx.arch.core:coretesting:$rootProject.archLifecycleVersion"

在我的build.gradle(项目)

ext {
    roomVersion = '2.1.0-alpha06'
    archLifecycleVersion = '2.0.0'
}

只需在依赖块中的 gradle_module 文件中更改 room_version 并更改您需要的其他房间关联库。以 https://developer.android.com/jetpack/androidx/releases/room#2.2.0-alpha01 为例。尽量使用最新稳定版room

我有同样的错误,我使用的是版本 2.1.x-alpha 更新到 2.2.3 后 新版本报错是我的一个实体没有主键