Как получить выбор комнаты с Liveata?

Я использую комнату с живыми существами. когда я выбираю из модели просмотра, я ничего не вижу. Но когда я выбираю прямо на дао, я вижу элементы. В чем проблема?

В комнате нет изменяемых жилетов, поэтому я выбрал ливадату ... но это не работает. пожалуйста, помогите мне. Я не понимаю своей проблемы.

когда я ввел "http://localhost:8080" с помощью debugImplementation 'com.amitshekhar.android:debug-db:1.0 .6 'и поискал результат запроса, результат правильный. Думаю, проблема в использовании ливедата. Я вошел в viewmodel, и это ноль.

@Dao
public interface MemoDao {
     @Query("select * from memolist where date between :fromDate and :toDate and isDeleted='true' order by date")
    LiveData<List<MemoEntity>> selectAll(String fromDate, String toDate);


    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertMemo(MemoEntity memo);

    @Update
    void updateMemo(MemoEntity memo);

    @Delete
    void deleteMemo(MemoEntity... memo);

}

@Database(entities = {MemoEntity.class}, version = 2)
public abstract class AppDatabase extends RoomDatabase {
    private static AppDatabase appDatabase;

    public abstract MemoDao MemoDao();

    public static AppDatabase getInstance(Context context){
        appDatabase = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, "memolist")
                .addMigrations(MIGRATION_1_2)
                .build();

        return appDatabase;
    }
    static final Migration MIGRATION_1_2= new Migration(1, 2) {
        @Override
        public void migrate(SupportSQLiteDatabase database) {
            database.execSQL("ALTER TABLE memolist ADD COLUMN id INTEGER NOT NULL DEFAULT 0");
        }
    };
}

public class MemoViewModel extends ViewModel {

    LiveData<List<MemoEntity>> memoModel;
    AppDatabase mRepository;

    public void init(Context context,String fromDate, String toDate){
        mRepository =  AppDatabase.getInstance(context);
        memoModel = mRepository.MemoDao().selectAll(fromDate,toDate);

    }

    public LiveData<List<MemoEntity>> memoList(){
        Log.d("TAG",memoModel.getValue().get(0).getId()+"");
        return memoModel;
    }
    public LiveData<List<MemoEntity>> memoListByTag(String tag, String fromDate, String toDate){
        memoModel = mRepository.MemoDao().selectAllByTag(tag,fromDate,toDate);
        return memoModel;
    }

}
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        fromDate = (String)dataHolder.popDataHolder("fromDate");
        toDate = (String)dataHolder.popDataHolder("toDate");
         memoViewModel = ViewModelProviders.of(this).get(MemoViewModel.class);
         memoViewModel.init(this.getContext(),fromDate,toDate);
         memoViewModel.memoList().observe(this, new Observer<List<MemoEntity>>(){
             @Override
             public void onChanged(List<MemoEntity> memoEntities) {
                listItems = memoViewModel.memoList().getValue();
                recyclerViewAdapter.notifyDataSetChanged();
             }
         });

    }

person user9628944    schedule 18.12.2019    source источник


Ответы (1)


измените свой класс MemoViewModel следующим образом

public class MemoViewModel extends ViewModel {

MutableLiveData<List<MemoEntity>> memoModel=new MutableLiveData();
AppDatabase mRepository;

public void init(Context context,String fromDate, String toDate){
    mRepository =  AppDatabase.getInstance(context);
    memoModel.postValue(mRepository.MemoDao().selectAll(fromDate,toDate))
}

public MutableLiveData<List<MemoEntity>> memoList(){
     return memoModel;
}
public LiveData<List<MemoEntity>> memoListByTag(String tag, String fromDate, String toDate){
    memoModel = mRepository.MemoDao().selectAllByTag(tag,fromDate,toDate);
    return memoModel;
}

}

измени свой класс дао, как

 @Dao
public interface MemoDao {
     @Query("select * from memolist where date between :fromDate and :toDate and isDeleted='true' order by date")
    List<MemoEntity> selectAll(String fromDate, String toDate);


    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertMemo(MemoEntity memo);

    @Update
    void updateMemo(MemoEntity memo);

    @Delete
    void deleteMemo(MemoEntity... memo);

}

MutableLiveData - это подкласс LiveData, который используется для некоторых его свойств (setValue / postValue), и с помощью этих свойств мы можем легко уведомить пользовательский интерфейс при вызове onChange ().

person Arunachalam k    schedule 18.12.2019
comment
это не работает. У меня ошибка при использовании изменяемых живых данных. это не уверен, как преобразовать Cursor в тип возвращаемого значения этого метода - person user9628944; 19.12.2019
comment
см. голосование, если приведенный выше код работает, возвращает какое-то значение. Я не могу понять, что вы пытаетесь сделать, пожалуйста, добавьте еще несколько объяснений кода, даже ясно - person Arunachalam k; 20.12.2019
comment
Вы когда-нибудь пробовали использовать комнату с изменяемыми данными? room не поддерживает изменяемые данные. поэтому я попробовал только liveata, но он не поддерживает memolist (). - person user9628944; 20.12.2019
comment
@ user9628944 Пожалуйста, проверьте последнюю версию, я обновил свой код - person Arunachalam k; 20.12.2019