Room Insert вставляет только первичный ключ, а не столбцы

Я пытаюсь вставить объект в базу данных своей комнаты, но кажется, что вставлен только первичный ключ. Дополнительные списки строк и целочисленные значения равны нулю, когда я пытаюсь получить к ним доступ.

сущность

@Entity
public class DayMenu{
@PrimaryKey @NonNull
private String dayDate;


@TypeConverters(IntegerConverter.class)
private List<Integer> dayRecipesID;

@TypeConverters(StringConverter.class)
private List<String> dayRecipesTitle;

Dao

@Dao
public interface DayMenuDao {

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertDayMenu(DayMenu dayMenu);

@Query("select * from DayMenu")
List<DayMenu> getAll();

@Query("select * from DayMenu")
LiveData<List<DayMenu>> getAllLD();

@Query("select dayDate from DayMenu where DayMenu.dayDate = :day_date")
DayMenu getFromDate(String day_date);
}

Когда я смотрю на dayMenu (ниже), у него будут два списка с правильными данными непосредственно перед тем, как я отправлю их для вставки. Однако эта информация либо не вставляется, либо не восстанавливается, когда я вызываю getAll(), getAllLD() или getFromDate().

Основная деятельность

        btnSave.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            if (etDate.getText().length() != 0) {
                String currentDate = etDate.getText().toString();

                DayMenu dayMenu = new DayMenu();
                dayMenu.setDayDate(currentDate);

                List<Integer> recIDs = new ArrayList<>();
                List<String> recTits = new ArrayList<>();
                StringBuilder sb = new StringBuilder();
                int childCount = linearLayoutParent.getChildCount();
                if (childCount > 1) {
                    for (int i = 0; i < childCount - 1; i++) {
                        View linearLayoutChild = linearLayoutParent.getChildAt(i);
                        ViewGroup lLC = (ViewGroup) linearLayoutChild;
                        Button recipeButton = (Button) lLC.getChildAt(0);
                        recIDs.add(Integer.parseInt(recipeButton.getTag().toString()));
                        recTits.add(recipeButton.getText().toString());

                    }

                    dayMenu.setDayRecipesID(recIDs);
                    dayMenu.setDayRecipesTitle(recTits);

                    for(String str : dayMenu.getDayRecipesTitle()){
                        sb.append(str).append(", ");
                    }

new AsyncIns(mViewModel.GetDayMenuDao(),dayMenu).execute();

                    Toast.makeText(_context, sb,Toast.LENGTH_SHORT).show();
                }
                else{
                    NoRecipesAddedHandler(_context);
                }
            }
            else{
                NoDateSelectedHandler(_context);
            }
        }
    });

AsyncTask

    private class AsyncIns extends AsyncTask<Void, Void, DayMenu>{
    final DayMenuDao mDao;
    final DayMenu mDM;

    AsyncIns(DayMenuDao dao, DayMenu dm){
        mDao = dao;
        mDM = dm;
    }

    @Override
    protected DayMenu doInBackground(Void... params){
        mDao.insertDayMenu(mDM);
        return mDao.getFromDate(mDM.getDayDate());
    }

    @Override
    protected void onPostExecute(DayMenu d){
        Toast.makeText(_context,d.getDayDate(),Toast.LENGTH_LONG).show();
    }
}

Это покажет дату, сохраненную в базе данных, и я смог увидеть даты с другими методами. Однако когда я пытаюсь получить доступ к recipeIds и заголовкам, списки становятся пустыми.

Я не совсем уверен, что происходит не так, похоже, что insertDayMenu вставляет только первичный ключ Entities.

2 ответа

SQLite не может иметь список типов данных<>. Может быть, вы хотите отношения один ко многим для этих областей? Где один DayMenu может иметь много DayRecipes.

Вы можете использовать библиотеку Stetho, чтобы увидеть, что на самом деле находится в базе данных:

добавьте эту строку в файл модуля build.gradule:

    implementation 'com.facebook.stetho:stetho:1.5.0'

затем добавьте файл Application.java следующим образом:

public class MyApplication extends Application {
    public void onCreate() {
        super.onCreate();
        Context context = getBaseContext();

        Stetho.initializeWithDefaults(this);

    }
}

затем добавьте в файл манифеста: в тег приложения добавьте:

android:name="MyApplication"

когда ваше приложение работает, откройте Google Chrome и введите:

chrome://inspect/#devices

Вы должны увидеть свое приложение - осмотрите его, и вы увидите, что находится в базе данных

Также я только что заметил, что вы используете camelcase для своих имен, что очень хорошо для Java, но не для базы данных:

Ваш код должен выглядеть так:

@TypeConverters(IntegerConverter.class)
@SerializedName("day_recipes_id")
@Expose
private List<Integer> dayRecipesID;

@TypeConverters(StringConverter.class)
@SerializedName("day_recipes_title")
@Expose
private List<Integer> dayRecipesTitle;
Другие вопросы по тегам