安卓房间-获取新插入行的id与自动生成-MVVM版本



如本文所述,Android Room-通过自动生成获取新插入行的id,可以从新插入的对象中获取id。

但是,如何在MVVM模式中从DAO一直到我的活动类都获得这个ID

上面的一些答案建议使用rxjava和类似的东西:
return Single.fromCallable<Long> { recipesDao.insertManual(cookingRecipes) }
但是实现两个完整的Gradle依赖项仅仅有一个方法调用有意义吗?

在我目前的结构下,难道没有办法做到这一点吗?

活动-ViewModel-存储库(-AsyncTask(-Dao


唯一的问题是从插入语句中获取返回值,该语句是从AsyncTask:调用的

private static class UpdateChallengeInfosAsyncTask extends AsyncTask<ChallengeInfos, Void, Void> {
private ChallengeInfosDao mAsyncTaskDao;
UpdateChallengeInfosAsyncTask(ChallengeInfosDao dao) {
mAsyncTaskDao = dao;
}
@Override
protected Void doInBackground(ChallengeInfos... challengeInfos) {
mAsyncTaskDao.insert(challengeInfos[0]);
return null;
}
}

也许像这里这样的onPostExecute()+Interface组合是可能的
由于AsyncTask是一个单独的类,如何将OnPostExecute((的结果获取到主活动?

只需将AsyncTask作为"活动"中的嵌套类即可。然后,您可以从onPostExecute()中调用属于"活动"的方法来传递ID值。

免责声明:AsyncTasks很糟糕,您应该使用其他方法。

免责声明2:如果您关注MVVM,ViewModel应该处理ID,而不是活动。

好吧,所以我最终做了什么,而且似乎运行得很好的是:

基本上使用了这个答案的结构:
https://stackoverflow.com/a/12575319/1972372

并在我的ViewModel中实现了AsynTask回调接口,其中有一个MutableLiveData对象,用于"活动"在开始时调用一次,并一直保持到更新一次:


public class ChallengeViewModel extends AndroidViewModel implements ChallengesRepository.UpdateChallengeInfosAsyncTask.AsyncResponse {

private MutableLiveData<Integer> insertedChlgInfoID;
....
....
public void insertChallengeInfos(ChallengeInfos challengeInfos) {
mRepository.insertChallengeInfos(challengeInfos, this);
}
public LiveData<Integer> getInsertedChlgInfoID() {
return insertedChlgInfoID;
}
@Override
public void processFinish(Long result) {
insertedChlgInfoID.setValue(Ints.checkedCast(result));
}
}

我理解AsyncTask在某些情况下可能被称为坏的原因,但我认为在我的情况下,它确实工作得很好,并且没有任何内存泄漏或类似的潜在风险,因为它只是非常基本的写操作。重写整个逻辑似乎对我的情况没有任何好处。

最新更新