我是Room
的新手,我正尝试query
我的database
从中获得row
。我尝试通过querying
和primary key
这是id来做到这一点,但是问题是我不知道如何从object
返回目标repository
。>
这是Dao
@Query("SELECT * FROM targets WHERE id = :id LIMIT 1")
Targets findTargetById(int id);
这是存储库类
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);
}
}
答案 0 :(得分:1)
您有两种返回结果的方法。
第一种方法是调用AsyncTask.get()
方法,但是如果任务超过5秒,它仍将保留MainThread并导致ANR:
public Targets findTarget (int id) {
return new findTargetByIDAsyncTask(mTargetsDao).execute(id).get();
}
第二种方法更复杂,但它不会保存MainThread。您应该添加一个回调类:
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);
}
}
答案 1 :(得分:0)
重点是从后台线程获取数据/对象。您可以使用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;
}