0

My task is to implement Kmap solver. I want to store state of the buttons in Room database but i faced with problem. The function getButton() in realization returns me null instead of my data

@ColumnInfo(name = "buttons")

. I create the row with 0001. I will devide it as a text for each button. btn0 -> 0, btn1 ->0, btn2... btn3->1 end so on. When i will click on the button i will update the row in db.

My dao file is

import androidx.room.Query;


@androidx.room.Dao
public interface Dao {

    @Query("SELECT * FROM Var2")
    Var2 getButtons();

    @Query("Update Var2 SET buttons = :buttons")
    void setButtons(String buttons);
}

My Database

@Database(entities = {Var2.class}, version = 2)
public abstract class KmapDatabase extends RoomDatabase {
    private static KmapDatabase INSTANCE;
    private static final String DB_NAME = "Kmap";

    public abstract Dao table2Dao();

    public static synchronized KmapDatabase getDatabase(Context context) {
        if (INSTANCE == null) {
            INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                    KmapDatabase.class, DB_NAME)
                    .fallbackToDestructiveMigration()
                    .allowMainThreadQueries()
                    .build();
        }
        return INSTANCE;
    }
}

Realisation is


public class Realization implements Repository{
    private Dao dao;

    public Realization(Dao dao) {
        this.dao = dao;
    }
    
    @Override
    public String getButton() {
        return dao.getButtons().getButtons();
    }
    
    @Override
    public void setButton(String buttons, Runnable onSuccess) {
        dao.setButtons(buttons);
        onSuccess.run();
    }

}

Repository

public interface Repository {
    String getButton();
    void setButton(String buttons, Runnable onSuccess);
}

Var2 (entity)


@Entity(tableName = "Var2")
public class Var2 {

    @PrimaryKey(autoGenerate = true)
    private int id;
    
    @ColumnInfo(name = "buttons")
    private String buttons = "0001";
    
    public int getId() {
        return id;
    }
    
    public void setId(int id) {
        this.id = id;
    }
    
    public String getButtons() {
        return buttons;
    }
    
    public void setButtons(String buttons) {
        this.buttons = buttons;
    }

}

My activity


public class Map2x2 extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map2x2);
        KmapDatabase db = KmapDatabase.getDatabase(getApplicationContext());
        Dao dao = db.table2Dao();
        Realization realization = new Realization(dao);
        realization.setButton("1111", () -> {
            runOnUiThread(() -> {
                Toast.makeText(this, "Button value saved", Toast.LENGTH_SHORT).show();
            });
        });
        String value = realization.getButton();//THIS IS NULL
        Log.v("1", value);
    }

I change a lot of variations but nothing works.

  • Can you add stack trace ? – jayesh gurudayalani May 05 '23 at 09:10
  • I think there is not necessarily a stack trace as the question is about `realization.getButton()` _returning_ `null` and not specifically a NPE. – dan1st May 05 '23 at 09:11
  • Because your `Var2` table has no records, as I see, you did not insert any records into it. So your `UPDATE` query affects 0 rows. That why your button is `null`. – fshdn19 May 05 '23 at 09:35

0 Answers0