问题描述
如此处Android Room - Get the id of new inserted row with auto-generate所述,可以从新插入的对象获取ID。
但是如何以MVVM模式从DAO到我的Activity类一直获取此ID?
那里的一些answers建议使用rxjava和类似的东西:return Single.fromCallable<Long> { recipesDao.insertManual(cookingRecipes) }
但是仅仅为了一个方法调用而实现两个完整的Gradle依赖关系是否有意义?
没有办法使这种结构与我当前的结构兼容吗?
活动-viewmodel-存储库(-AsyncTask)-道
唯一的问题是从插入语句中获取返回值,该插入值是从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中的嵌套类。然后,您可以从onPostExecute()
调用属于您的Activity的方法以传递ID值。
免责声明:AsyncTasks不好,您应该使用其他东西。
免责声明2:如果您关注的是MVVM,则ViewModel应该处理ID,而不是Activity。
,好的,所以我最终要做的是,看起来效果很好的是:
基本上使用此答案中的结构:
https://stackoverflow.com/a/12575319/1972372
并在4 3
3 2
2 1
4 2
的{{1}}对象中实现了#include <bits/stdc++.h>
using namespace std;
pair<int,int> strToSotredPair(const string& s) {
int a = 0,b = 0;
int pos = 0;
while (s[pos] != ' ') {
a = a * 10 + s[pos] - '0';
++pos;
}
while (pos < s.size()) {
b = b * 10 + s[pos] - '0';
++pos;
}
return {min(a,b),max(a,b)};
}
int main() {
int n,m;
string input;
cin >> n;
cin >> m;
vector<set<int>> res(n,set<int>());
for (int i = 0; i < m; ++i) {
cin >> input;
auto cur = strToSotredPair(input);
res[cur.first - 1].insert(cur.second); // error in this line
}
for (int i = 0; i < res.size(); ++i) {
cout << res[i].size() << ' ';
for (auto item : res[i]) {
cout << item << ' ';
}
cout << endl;
}
}
回调接口,以便该Activity在开始时调用一次并挂起,直到更新一次:>
AsynTask
我了解在某些情况下ViewModel
可能会被称为坏的原因,但是我认为对于我来说,它确实可以正常工作,并且没有任何潜在的内存泄漏或类似风险,因为它只是非常基本的写操作。重写整个逻辑似乎对我的情况没有任何好处。