Android Room - 使用自动生成获取新插入行的 ID - MVVM 版本
Android Room - Get the id of new inserted row with auto-generate - MVVM Version
如此处所述 可以从新插入的对象中获取 ID。
但是我如何在 MVVM 模式中从 DAO 一直获取这个 ID 到我的 Activity class?
那里的一些 建议使用 rxjava 和类似这样的东西:
return Single.fromCallable<Long> { recipesDao.insertManual(cookingRecipes) }
但是,仅仅为了一个方法调用而实现两个完整的 Gradle 依赖项有意义吗?
有没有一种方法可以使它适用于我当前的结构?
Activity - ViewModel - Repository ( - AsyncTask) - Dao
唯一的问题是从 AsyncTask
:
调用的插入语句中获取 return 值
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
组合?
How to get the result of OnPostExecute() to main activity because AsyncTask is a separate class?
只需将 AsyncTask 嵌套在 Activity 中即可 class。然后你可以从 onPostExecute()
调用属于你的 Activity 的方法来传递 ID 值。
免责声明:AsyncTasks 不好,您应该使用其他东西。
免责声明 2:如果您遵循 MVVM,ViewModel 应该处理 ID 而不是 Activity。
好吧,我最后做了什么,似乎工作得很好是这样的:
基本上使用了这个答案的结构:
并在我的 ViewModel
中实现了 AsynTask
callback-interface,其中包含一个 MutableLiveData
对象,以便 Activity 在开始时调用一次并坚持下去直到更新一次:
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
在某些情况下可能被称为坏的原因,但我认为在我的情况下它确实工作正常并且实际上没有任何潜在的内存泄漏或类似风险,因为它是只有非常基本的写操作。重写整个逻辑似乎对我的情况没有任何好处。
如此处所述
但是我如何在 MVVM 模式中从 DAO 一直获取这个 ID 到我的 Activity class?
那里的一些
return Single.fromCallable<Long> { recipesDao.insertManual(cookingRecipes) }
但是,仅仅为了一个方法调用而实现两个完整的 Gradle 依赖项有意义吗?
有没有一种方法可以使它适用于我当前的结构?
Activity - ViewModel - Repository ( - 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
组合?
How to get the result of OnPostExecute() to main activity because AsyncTask is a separate class?
只需将 AsyncTask 嵌套在 Activity 中即可 class。然后你可以从 onPostExecute()
调用属于你的 Activity 的方法来传递 ID 值。
免责声明:AsyncTasks 不好,您应该使用其他东西。
免责声明 2:如果您遵循 MVVM,ViewModel 应该处理 ID 而不是 Activity。
好吧,我最后做了什么,似乎工作得很好是这样的:
基本上使用了这个答案的结构:
并在我的 ViewModel
中实现了 AsynTask
callback-interface,其中包含一个 MutableLiveData
对象,以便 Activity 在开始时调用一次并坚持下去直到更新一次:
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
在某些情况下可能被称为坏的原因,但我认为在我的情况下它确实工作正常并且实际上没有任何潜在的内存泄漏或类似风险,因为它是只有非常基本的写操作。重写整个逻辑似乎对我的情况没有任何好处。