Search code examples
javaandroidandroid-room

Room database instance cannot resolve symbol of DAO methods


When trying to use Room Library for database handling, Android Studio cannot resolve symbol of itemDao() method in MainActivity:

db.itemDao().insert(item);

MainActivity.java

public class MainActivity extends AppCompatActivity {

    Button btn;
    EditText et;
    TextView tv;
    RoomDatabase db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = findViewById(R.id.button);
        et = findViewById(R.id.editText);
        tv = findViewById(R.id.textView);

        db = MyDatabase.getInstance(this);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Item item = new Item();
                item.info = et.getText().toString();
                tv.setText(item.info);
                db.itemDao().insert(item);
            }
        });
    }
}

Item.java

@Entity(tableName = "tableItems")
public class Item {
    @PrimaryKey(autoGenerate = true)
    public int uid;

    @ColumnInfo(name = "info")
    public String info;
}

ItemDao.java

@Dao
public interface ItemDao {
    @Query("SELECT * FROM tableItems")
    List<Item> getItemsList();

    @Insert
    void insert(Item item);

    @Delete
    void delete(Item item);
}

MyDatabase.java

@Database(entities = {Item.class}, version = 1)
public abstract class MyDatabase extends RoomDatabase {

    public abstract ItemDao itemDao();
    private static MyDatabase INSTANCE;
    private static final String DATABASE_NAME = "MyDatabase";

    public synchronized static MyDatabase getInstance(Context context) {
        if (INSTANCE == null) {
            INSTANCE = Room.databaseBuilder(context.getApplicationContext(), MyDatabase.class, DATABASE_NAME)
                    .allowMainThreadQueries()
                    .build();
        }
        return INSTANCE;
    }
}

Solution

  • Your db is of type RoomDatabase. RoomDatabase doesn't have an itemDao() method, your MyDatabase extending it has. So this field should be of type MyDatabase if you want to be able to access itemDao()