我是新来的房间
和我试图查询
我的数据库
得到一个行
从它。我试图这样做的查询
它与主键
这是id但问题是我不知道如何返回目标对象
从存储库
。
这就是<代码>刀
@Query("SELECT * FROM targets WHERE id = :id LIMIT 1")
Targets findTargetById(int id);
这是Repository类
public Targets findTarget (int id) {
new findTargetByIDAsyncTask(mTargetsDao).execute(id);
}
private static class findTargetByIDAsyncTask extends AsyncTask<Integer, Void, Targets> {
private TargetsDao mAsyncTaskDao;
findTargetByIDAsyncTask(TargetsDao dao) {
mAsyncTaskDao = dao;
}
@Override
protected Targets doInBackground(Integer... integers) {
return mAsyncTaskDao.findTargetById(integers[0]);
}
@Override
protected void onPostExecute(Targets targets) {
super.onPostExecute(targets);
}
}
关键是从后台线程获取数据/对象。你可以使用Android的AsyncTask
或ExecutorService
。一个简单的例子是,如果想要获取用户名的字符串,方法如下:
private String getName() {
String name = null;
try {
name = Executors.newSingleThreadExecutor().submit(() ->
userDao.fetchUserName()).get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
return name;
}
有两种方法可以返回结果。
第一种方法是调用AsyncTask.get()
方法,但是如果一个任务超过5秒,它仍然会保留一个导致ANR的主线程:
public Targets findTarget (int id) {
return new findTargetByIDAsyncTask(mTargetsDao).execute(id).get();
}
第二种方法更复杂,但它无法保持主线程。您应该添加一个回调类:
public interface Callback {
void onSuccess(Targets targets);
}
存储库中的每个方法如下所示:
public void findTarget (Callback callback, int id) {
new findTargetByIDAsyncTask(mTargetsDao, callback).execute(id);
}
AsynTask看起来是这样的:
private static class FindTargetByIDAsyncTask extends AsyncTask<Integer, Void, Targets> {
private final TargetsDao mAsyncTaskDao;
private final Callback callback;
FindTargetByIDAsyncTask(TargetsDao dao, Callback callback) {
mAsyncTaskDao = dao;
this.callback = callback;
}
@Override
protected Targets doInBackground(Integer... integers) {
return mAsyncTaskDao.findTargetById(integers[0]);
}
@Override
protected void onPostExecute(Targets targets) {
callback.onSuccess(targets);
}
}
错误:查询有问题:[SQLITE_ERROR]SQL错误或缺少数据库(没有这样的表:任务) 显示了这个错误,我怎么可能修复它? 我正在学习这个教程
并且我发现了基于数据库版本4的可能场景的迁移varargs。 我的问题是,假设我使用的是db v1的Room,当我的应用程序到达db v10时,我将不得不编写多少迁移方法? 在sqlite中,我们在中获得已安装应用程序的当前db版本,我们只需通过开关大小写而不使用break语句,以便满足所有db升级。
我正在尝试获取消息的地图,作者id键如下: 这是我尝试过的: MessageViewModel.getAll()方法返回: 然后我将其转换为一个可流动的流(Flowable::fromIterable),这样它可以一次发出一个项目,而不是整个列表,然后我使用“toMultiMap”进行映射 on成功方法从不被调用,我不知道这里出了什么问题。如果我不使用toMultiMap(并对代码进行相应的修改)
当我试图构建我的应用程序时,我遇到了以下编译错误: 持久性模块在Android设置中是独立的。 建筑格拉德尔 ext.androidXRoom=“2.1.0-alpha02” 我试着把kotlin版本,room版本,改回AndroidArch room,但没用。我还尝试了清理项目和使Android Studio的缓存失效。但它不起作用。 编辑:AppDatabase源
我读过这篇文章。 Room支持注释,以在运行时构造查询,例如代码A。 如果我使用代码B,当我完成它时,我会得到错误B。 似乎不支持返回,对吧? 代码A 代码B 错误B
我转换java代码到kotlin代码,我得到类型未解决的java类错误。 我的Java类是 已转换的Kotlin类 非常感谢。