【问题标题】:How to get room select with livedata?如何使用 livedata 进行房间选择?
【发布时间】:2019-12-18 11:23:59
【问题描述】:

我正在使用带有 livedata 的房间。 当我从视图模型中选择时,我什么都看不到。 但是当我直接选择到dao时,我可以看到项目。 有什么问题?

房间没有可变的 livedata,所以我选择了 livadata... 但它不起作用。 请帮我。 我不明白我的问题。

当我使用 debugImplementation 'com.amitshekhar.android:debug-db:1.0.6' 输入“http://localhost:8080”并搜索结果查询时,结果是正确的。 我认为问题在于使用实时数据。 我登录了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();
             }
         });

    }

【问题讨论】:

    标签: android android-room android-mvvm


    【解决方案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 类

     @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() 时轻松通知 UI。

    【讨论】:

    • 它不工作。使用可变实时数据时出现错误。即“不确定如何将游标转换为此方法的返回类型”
    • 如果上面的代码工作返回一些值,请查看upvote。我不明白你想做什么请添加更多代码解释甚至清楚
    • 你有没有尝试过使用带有 mutablelivedata 的房间? room 不支持 mutablelivedata。所以我只尝试了 livedata,但它不支持 memolist().observe
    • @user9628944 请检查最新的我更新了我的代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 2021-02-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    相关资源
    最近更新 更多