房间数据库未创建
Room database not created
我正在尝试使用 Room 开发应用程序。该项目在 java。这是我第一次使用 Room。
我已按照文档并使用@Database、@Dao 和@Entity 创建了 class。但是,当我 运行 应用程序时,它抛出以下异常。
有人可以帮我弄清楚我在这里做错了什么吗?弄了一天还是没弄明白
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.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)
以下是 classes:
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"
}
请帮助我了解我在哪里犯了错误。
您遇到的问题是因为 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"
我遇到了同样的错误。像这样更改您的依赖项:
dependencies {
def roomVersion = "2.4.1"
implementation("androidx.room:room-runtime:$roomVersion")
kapt("androidx.room:room-compiler:$roomVersion")
implementation("androidx.room:room-ktx:$roomVersion")
}
我正在尝试使用 Room 开发应用程序。该项目在 java。这是我第一次使用 Room。
我已按照文档并使用@Database、@Dao 和@Entity 创建了 class。但是,当我 运行 应用程序时,它抛出以下异常。
有人可以帮我弄清楚我在这里做错了什么吗?弄了一天还是没弄明白
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.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)
以下是 classes:
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"
}
请帮助我了解我在哪里犯了错误。
您遇到的问题是因为 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"
我遇到了同样的错误。像这样更改您的依赖项:
dependencies {
def roomVersion = "2.4.1"
implementation("androidx.room:room-runtime:$roomVersion")
kapt("androidx.room:room-compiler:$roomVersion")
implementation("androidx.room:room-ktx:$roomVersion")
}