java - 未创建房间数据库
问题描述
我正在尝试使用 Room 开发应用程序。该项目是在java中。这是我第一次使用 Room。
我遵循文档并使用@Database、@Dao 和@Entity 创建了类。但是,当我运行该应用程序时,它会引发以下异常。
有人可以帮我弄清楚我在这里做错了什么吗?我已经花了一天的时间,但仍然无法弄清楚。
2021-02-07 20:29:16.151 13959-13959/com.hello.testapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.hello.testapp, PID: 13959
java.lang.RuntimeException: cannot find implementation for com.hello.testapp.persistance.MyDatabase. MyDatabase_Impl does not exist <----- ERROR
at androidx.room.Room.getGeneratedImplementation(Room.java:94)
at androidx.room.RoomDatabase$Builder.build(RoomDatabase.java:952)
at com.hello.testapp.persistance.MyDatabase.getInstance(MyDatabase.java:33)
at com.hello.testapp.repositories.MyClientRepo.<init>(MyClientRepo.java:30)
at com.hello.testapp.SplashActivity$1.run(SplashActivity.java:45)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
以下是课程:
类别.java:
@Entity(tableName = "category")
public class Category {
@PrimaryKey
@SerializedName("category_name")
@Expose
private String categoryName;
@SerializedName("type")
@Expose
private int type;
public Category() {}
public Category(String categoryName, int type) {
this.categoryName = categoryName;
this.type = type;
}
public String getCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
}
MyDao.java:
@Dao
public interface MyDao {
@Query("SELECT * FROM category LIMIT (:pageNum * 10)")
LiveData<List<Category>> getCategories(int pageNum);
}
我的数据库.java:
@Database(entities = {Category.class}, version = 1)
@TypeConverters({ListConverter.class})
public abstract class MyDatabase extends RoomDatabase {
private static final String DATABASE_NAME = "my_db";
private static MyDatabase db;
public static MyDatabase getInstance(Context context) {
if(db == null) {
System.out.println("creating instance");
db = Room.databaseBuilder(
context.getApplicationContext(),
MyDatabase.class,
DATABASE_NAME
).build();
}
return db;
}
public abstract MyDao getDao();
}
ListConverter.java:
public class ListConverter {
@TypeConverter
public static List<String> fromString(String value) {
Type listType = new TypeToken<List<String>>(){}.getType();
return new Gson().fromJson(value, listType);
}
@TypeConverter
public static String fromList(List<String> list) {
return new Gson().toJson(list);
}
}
构建.gradle
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'
}
dependencies {
..other dependencies
def room_version = "2.2.6"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
def hilt_version = '2.31.2-alpha'
implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
}
请帮助我了解我在哪里犯了错误。
解决方案
您面临的问题是由于java 注释,例如。在这种情况下@Database。Kotlin 不能很好地使用 java 注释,这是我知道导致找不到此类问题 (Database_Impl.java) 的原因之一。
为了在您的 java 项目中修复它,您需要像下面这样更新依赖项并将突出显示的部分从 更改annotationProcessor
为implementation
. 我仍然需要了解为什么在更改为实现时它会起作用,所以如果有人可以在下面发表评论,那将非常有帮助。
def room_version = "2.2.6"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
//add the following & instead of annotationProcessor use implementation
implementation "android.arch.persistence.room:compiler:$room_version"
推荐阅读
- wordpress - 使用 polylang 翻译定制器选项
- c - 如何将 MISRA C 错误用于汇编语言内联函数?
- vba - 显示行号而不移动列
- css - CSS 动画 - 上下移动的 div 之间的动态曲线
- powerbi - 我可以制作带有 3 轴的 Power BI 趋势图吗?
- http - http请求中有多个get请求
- python - 尝试在while循环中除外 - python
- oracle - 我正在尝试在插入新行后使用触发器更新数据库中多个表中的 2 个字段
- angular - ngx-datatable - 引导主题 - 列标题
- entity-framework - 使用 EntityFramework 时如何限制 INSERT 中使用的列数?