我正在尝试使用 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)
以下是课程:
Category.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);
}
MyDatabase.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);
}
}
Build.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"
}
请帮助我理解我哪里出错了。
答案 0 :(得分:2)
您面临的问题是由于 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"