Android Room-通过自动生成获取新插入行的ID-MVVM版本

问题描述

如此处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可能会被称为坏的原因,但是我认为对于我来说,它确实可以正常工作,并且没有任何潜在的内存泄漏或类似风险,因为它只是非常基本的写操作。重写整个逻辑似乎对我的情况没有任何好处。