正如这里讨论的,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()的结果获取到主活动?
好吧,我最后做的,看起来效果很好的是:
基本上使用了这个答案中的结构:
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
可能被称为坏任务,但我认为在我的情况下,它确实可以正常工作,并且没有内存泄漏或类似的潜在风险,因为它只是非常基本的写操作。重写整个逻辑似乎对我的案子没有任何好处。
只需将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