【发布时间】:2020-09-12 06:43:54
【问题描述】:
我正在使用房间持久性库来更新数据库。我被困在想要获取最近插入记录的 id 的地方。
我知道使用 long as 作为 insert 方法的返回类型会返回 id。但是我通过视图模型访问这个 Dao 方法。
我的DAO方法如下:
//MyDao
@Insert
long insert(RecordItem record);
通过执行以下操作从存储库访问此方法:
//MyRepository
public class MyRepository {
private MyDao myDao;
public MyRepository(@NonNull Application application) {
MainDatabase mainDatabase = MainDatabase.getInstance(application);
myDao = mainDatabase.myDao();
}
public void insert(RecordItem record) {
MainDatabase.dbWriteExecutor.execute(() -> {
myDao.insert(record);
});
}
}
并且从viewmodel调用repository方法如下:
//MyViewModel
public void insert(RecordItem record) {
repository.insert(record);
}
最后viewmodel方法为:
//MyActivity
myViewModel.insert(record);
我的问题是,我不知道如何通过 viewmodel 方法获得长时间返回。我尝试在存储库中这样做
//MyRepository
public class MyRepository {
private MyDao myDao;
private long id;
public MyRepository(@NonNull Application application) {
MainDatabase mainDatabase = MainDatabase.getInstance(application);
myDao = mainDatabase.myDao();
}
public long insert(RecordItem record) {
MainDatabase.dbWriteExecutor.execute(() -> {
id = myDao.insert(record);
});
return id;
}
}
以及随后对 viewmodel 方法的更改。
但是,它返回 0,我想这是因为 insert 方法在不同的线程上执行,并且在到达语句后立即返回 id(如果我错了,请纠正我)。
提前致谢。
【问题讨论】:
-
您可以使用回调接口的方式进行尝试。将单个方法接口作为方法参数传递给存储库方法插入,并在执行方法上调用它以提供回调。
-
@JeelVankhede 你能解释一下如何按照你的建议做吗?
-
this answer 中给出了使用
Callable执行后台工作并返回结果的示例。
标签: java android android-sqlite android-room