Запрос базы данных номеров - PullRequest
0 голосов
/ 09 сентября 2018

Я новичок в Room, и я пытаюсь query мой database, чтобы получить row от него.Я попытался сделать это с помощью querying с помощью primary key, который является идентификатором, но проблема в том, что я не знаю, как вернуть цель 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 голосов
/ 09 сентября 2018

Смысл в том, чтобы получить данные / объект из фонового потока. Вы можете использовать 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;
}
0 голосов
/ 09 сентября 2018

У вас есть два способа вернуть результат.

Первый способ - вызвать метод AsyncTask.get(), но он по-прежнему будет удерживать MainThread, что приводит к ANR, если задача будет дольше 5 секунд:

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...