房间数据库查询

Room Database Query

我是 Room 的新手,我正在尝试 query 我的 database 从中获得 row。我尝试通过 querying 它与 primary key 这是 id 但问题是我不知道如何 return 来自 [=19= 的目标 object ].

这是Dao

@Query("SELECT * FROM targets WHERE id = :id LIMIT 1")
Targets findTargetById(int id);

这是存储库 class

 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);
    }
}

您有两种方法可以return一个结果。

第一种方法是调用 AsyncTask.get() 方法,但它仍然会持有一个 MainThread,如果任务超过 5 秒就会导致 ANR:

public Targets findTarget (int id) {
    return new findTargetByIDAsyncTask(mTargetsDao).execute(id).get();
}

第二种方式比较复杂,但是不会hold住MainThread。您应该添加一个回调 class:

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);
    }
}

重点是从后台线程获取 data/object。您可以使用 Android 的 AsyncTaskExecutorService。一个简单的例子是如果你想得到一个用户名的字符串,方法是:

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