【问题标题】:cannot find implementation for database Room找不到数据库 Room 的实现
【发布时间】:2021-07-10 05:55:13
【问题描述】:

我正在使用 Room 编写我的第一个应用程序。我发现它在使用 kotlin 时会出现问题,甚至某些示例在我的机器上也不起作用,所以我回滚到纯 Java。

FilmsDatabaseJ db = Room.databaseBuilder(getApplicationContext(), FilmsDatabase.class, "DATABASE_NAME").build();

此调用失败并出现异常:

java.lang.RuntimeException: cannot find implementation for com.home.myapplication.films.storage.FilmsDatabase. FilmsDatabase_Impl does not exist

我探索了源代码,Room 预计已经有这样的类(是否在某处生成?),但由于某种原因,对于离文档不远的我的案例,这样的类不存在。您能否分享您的想法,这里可能出了什么问题?

@TypeConverters({Converters.class})
@Database(entities = {Film.class, User.class, UserFilms.class}, version = 1)
public abstract class FilmsDatabaseJ extends RoomDatabase {

    private static final String DATABASE_NAME = "DATABASE_NAME";

    private static FilmsDatabaseJ instance;

    public abstract FilmsDaoJ getFilmsDao();


    @NotNull
    public static FilmsDatabaseJ getInstance(Context context) {
        if (instance == null) {
            synchronized (FilmsDatabaseJ.class) {
                if (instance != null) return
                instance = Room.databaseBuilder(context, FilmsDatabaseJ.class, DATABASE_NAME).build();
            }
        }
        return instance;
    }
} 



   annotationProcessor "android.arch.lifecycle:compiler:1.1.1"

    // Room (use 1.1.0-beta2 for latest beta)
    implementation "android.arch.persistence.room:runtime:1.0.0"
    annotationProcessor "android.arch.persistence.room:compiler:1.0.0"

【问题讨论】:

  • 您是否在build.gradledependencies 闭包中添加了注释处理器?见developer.android.com/topic/libraries/architecture/…
  • 是的,我做到了。刚刚添加到帖子中
  • 标题中的错误与问题中的错误不同。你得到的是哪一个?如果您获得的是“可用的公共构造函数”,那将与您的 @Entity 类或您的 @Dao 类上的方法返回的任何 POJO 相关联。
  • 感谢您的收看!这不是正确的标题。我修好了
  • 好的。注释处理器应该在模块内部的build/generated/source/apt/debug/com/home/myapplication/films/storage/impl/ 中生成代码(例如,app/)。有什么显示在那里吗?

标签: android android-room


【解决方案1】:

这是因为 kotlin 编译器不适用于 @Database java 注解(它会为您生成 FilmsDatabase_Impl)。

所以要解决这个问题:

  • 首先您需要获取kapt 插件来解析kotlin 文件中的注释,将其添加到您的应用级gradle:

    apply plugin: 'kotlin-kapt'

  • 然后将 annotationProcessor 替换为 kapt 用于 Room 的编译器

    kapt "android.arch.persistence.room:compiler:1.0.0"

  • 现在再次编译项目,您应该会看到生成了这些样板代码并解决了上述错误。

【讨论】:

  • 谢谢。我和 Room 合作有一段时间了,可能我已经找到了答案。我不记得了。我会在有时间验证时接受您的重播。
  • 是的,以防万一其他人遇到同样的问题,希望它会有所帮助
  • 四 (4) 年后遇到完全相同的问题!
【解决方案2】:

解决方案: def room_version = "2.3.0"

implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
implementation "androidx.room:room-ktx:2.3.0"

【讨论】:

    猜你喜欢
    • 2018-10-31
    • 2019-11-08
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2019-09-27
    • 2018-10-02
    • 2019-01-22
    相关资源
    最近更新 更多