会议室数据库查询

时间:2018-09-09 09:00:07

标签: java android android-room

我是Room的新手,我正尝试query我的database从中获得row。我尝试通过queryingprimary 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);
    }
}

2 个答案:

答案 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的AsyncTaskExecutorService。一个简单的示例是,如果要获取用户名的字符串,则该方法为:

private String getName() {
    String name = null;
    try {
        name = Executors.newSingleThreadExecutor().submit(() ->
                userDao.fetchUserName()).get();
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }
    return name;
}