当前位置: 首页 > 知识库问答 >
问题:

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

郤玉书
2023-03-14

正如这里讨论的,Android Room-使用auto generate获取新插入行的id,可以从新插入的对象获取id。

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

上面的一些答案建议使用rxjava和类似的东西:
返回单条。从可调用

有没有办法让我现在的结构发挥作用?

活动-ViewModel-Repository(-AsyncTask)-Dao

唯一的问题是从insert语句中获取返回值,insert语句是从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()接口组合
由于AsyncTask是一个单独的类,如何将OnPostExecute()的结果获取到主活动?


共有2个答案

酆晔
2023-03-14

好吧,我最后做的,看起来效果很好的是:

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

并在myViewModel中使用一个MutableLiveData对象实现了AsynTask回调接口,以便活动在开始时调用一次,并一直保持到更新一次:


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

江宏深
2023-03-14

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

免责声明:异步任务不好,您应该使用其他任务。

免责声明2:如果您正在跟踪MVVM,ViewModel应该处理ID而不是活动。

 类似资料:
  • 数据访问对象: 有没有可能在上述方法本身中完成插入后返回用户的id,而不需要编写单独的select查询?

  • 问题内容: 我将SQLite与Android一起使用,我想知道获取插入的行的生成ID的最佳方法。 我认为有一个解决方案可以在包含之后进行搜索,但它并不是最好的方法。 问题答案: 该方法返回刚插入的行或插入期间发生错误的行。 db在哪里。

  • 问题内容: 我有一个查询要在表中插入一行,该表有一个名为ID的字段,该字段在列上使用AUTO_INCREMENT填充。我需要为下一个功能获取此值,但是当我运行以下命令时,即使实际值不为0,它也总是返回0: 根据我的理解,这应该返回ID列,但每次仅返回0。有任何想法吗? 编辑: 当我跑步时: 我得到: 问题答案: [编辑:在引用last_insert_id()之前添加了“选择”] 插入后运行“ ”怎

  • 在下面的代码中,我得到。我读到,也可以直接从获取最后插入的行id。在我的代码中,我把空插入改为长,并尝试了许多其他的东西,就像我在互联网上找到的例子一样,但是每次我都会出错。你想给我提供一个代码/解决方案,从@插入获取行/用户ID吗? 实体 存储库 查看模型 片段/活动

  • 问题内容: 我正在掌握PDO的基础知识。 但是我试图获取插入的行的ID,我使用: 我遇到的教程都是关于交易的,但是我没有使用交易! 问题答案: 您可能正在寻找lastInsertId。“返回最后插入的行或序列值的ID”。

  • 保存课程()应该启动验证导师()来创建和/或验证导师的当前输入信息是否可以添加到课程实体构造器中。mMentorViewModel.save导师(mMentor)应该通过Schuldler存储库,而Schuludler存储库使用数据库中的MentorDAO来插入新的导师。 我读过这个方法Android Room-使用auto generate获取新插入行的id,但是我缺少一些关于如何获取新创建的m