找不到数据库 Room 的实现

cannot find implementation for database Room

提问人:Gleichmut 提问时间:4/12/2018 最后编辑:Gleichmut 更新时间:7/10/2021 访问量:5103

问:

我正在用 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"
安卓

评论

0赞 CommonsWare 4/12/2018
您是否将注释处理器添加到您的闭包中?请参阅 developer.android.com/topic/libraries/architecture/...dependenciesbuild.gradle
0赞 Gleichmut 4/12/2018
是的。刚刚将其添加到帖子中
0赞 CommonsWare 4/12/2018
标题中的错误与问题中的错误不同。你得到的是哪一个?如果你得到的是“可用的公共构造函数”,它将与你的类或你的类上的方法返回的任何 POJO 相关联。@Entity@Dao
0赞 Gleichmut 4/13/2018
谢谢你的捕捉!这不是正确的标题。我修好了
0赞 CommonsWare 4/13/2018
还行。注解处理器应该在模块内部生成代码(例如,)。那里有什么东西出现吗?build/generated/source/apt/debug/com/home/myapplication/films/storage/impl/app/

答:

11赞 Trung Le 8/28/2018 #1

这是因为 kotlin 编译器不能很好地处理@Database java 注释(它会为您生成FilmsDatabase_Impl

因此,要解决这个问题:

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

    apply plugin: 'kotlin-kapt'

  • 然后替换为 room 的编译器annotationProcessorkapt

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

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

评论

0赞 Gleichmut 8/28/2018
谢谢。当我与Room合作一段时间时,可能已经找到了答案。我不记得了。我会在有时间验证时接受你的重播。
0赞 Trung Le 8/29/2018
是的,以防万一其他人在同样的问题上绊倒,希望它可能会有所帮助
0赞 dobhareach 2/4/2022
四 (4) 年后,有完全相同的问题!
0赞 Misael Antonio Peláez 7/10/2021 #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"