Room database not created

Tags: , , , ,



I’m trying to develop an app with Room. The project is in java. This is my first time using Room.

I’ve followed the documentation and created class with @Database, @Dao & @Entity. However when I run the app, it throws the following exception.

Can someone please help me figure out what am I doing wrong here? I’ve spent a day on it but still couldn’t figure out.

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)

Following are the 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"
}

Please help me understand where am I making a mistake.

Answer

The problem you’re facing is because of the java annotations eg. in this case @Database. Kotlin doesn’t play well with the java annotations, that’s one of the reasons I know which caused such problem (Database_Impl.java) not found.

In order to fix it in your java project, you need to update the dependencies like the following & change the highlighted part from annotationProcessor to implementation. I still need to understand why it works when changing to implementation so if someone can comment below, that’ll be really helpful.

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" 


Source: stackoverflow