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

时间:2019-03-17 11:29:19

标签: android android-gradle android-room androidx

我一直收到此错误。 我正在从事一个项目,在开发过程中,我决定迁移到AndroidX。

我收到以下错误:

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
}

12 个答案:

答案 0 :(得分:30)

我将Room 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 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/' }

没有错误,但已编译。我已经在真实设备中测试了我的应用数周,并且运行我的应用没有任何问题。我的会议室数据库运行正常。

答案 1 :(得分:9)

我通过降级为以下方法解决了这个问题:

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

答案 2 :(得分: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/" }

在这些更改之后,别忘了清理并重建项目

答案 3 :(得分:2)

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

答案 4 :(得分:2)

使缓存无效并重新启动解决了我的问题。我的会议室版本为2.1.0-alpha06,并且还向项目存储库添加了以下依赖项:

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

答案 5 :(得分:2)

我遇到了同样的错误,我更新了房间资料库,但问题未解决, 然后我按照以下步骤进行操作,...解决了该问题之后,

步骤1:检查项目中的@DataBase类并检查是否插入了所有表(实体)

第2步:递增版本号

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

在这些更改之后,别忘了清理并重建项目

答案 6 :(得分:1)

在输入此答案时,我收到了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存储库。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

添加import androidx.room.Dao;,然后重新导入对我来说很成功。

答案 9 :(得分:0)

我通过将其添加到build.gradle(模块)中解决了

    androidTestImplementation "androidx.arch.core:coretesting:$rootProject.archLifecycleVersion"

在我的build.gradle(Project)

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

答案 10 :(得分:0)

只需在依赖块中的gradle_module文件中更改room_version,然后更改所需的其他与房间相关的库。以https://developer.android.com/jetpack/androidx/releases/room#2.2.0-alpha01为例。尝试使用最新的稳定版本的房间。

答案 11 :(得分:0)

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