Как получить идентификатор вставленного объекта при использовании AsyncTask? - PullRequest
0 голосов
/ 07 октября 2018

Мне пришлось создать учетную запись, чтобы задать этот вопрос, потому что я не мог найти правильный способ сделать это.Единственное, что подходит, это этот вопрос здесь , но он не доходит до конца, и я все еще застрял.Вот и мы ...

Я пытаюсь создать приложение, следуя такому же принципу Компоненты архитектуры .В настоящее время я пытаюсь добавить строку в одну из моих таблиц базы данных и получить идентификатор этой строки в ответ, чтобы затем вставить строку в другую таблицу со ссылкой на первую.

Iсоздал объект моей базы данных:

@Entity(indices = {@Index("id")})
public class Search {

    @PrimaryKey(autoGenerate = true) private int id;
...

и соответствующий DAO:

@Dao
public interface SearchDao {

    @Insert
    long insert(Search search);
...

Как видите, мой DAO возвращает long с созданным идентификатором.Это поведение, которое было указано в вопросе, который я связал ранее, и задокументировано здесь .

Поскольку я следую принципам компонентов архитектуры Android, я использую класс Repository длявся моя работа с базой данных.В этом репозитории я создал открытый метод для вставки нового объекта, который создает и выполняет AsyncTask для выполнения этой работы:

public class Repository {
    public void insertSearch(Search search) {
        new insertSearchAsyncTask(this.mSearchDao).execute(search);
    }

...
    private static class insertSearchAsyncTask extends AsyncTask<Search, Void, Long> {

        private SearchDao mAsyncTaskDao;

        insertSearchAsyncTask(SearchDao dao) {
            this.mAsyncTaskDao = dao;
        }

        @Override
        protected Long doInBackground(final Search... params) {
            long id = this.mAsyncTaskDao.insert(params[0]);
            return id;
        }
}

Я знаю, что могу использовать метод onPostExecute (long id)делать вещи с результатом метода doInBackground, но этот метод onPostExecute не может ничего возвратить методу insertSearch, где я создал AsyncTask и выполнил его.

Я знаю, что нужно изменить тип возврата моего метода insertSearchдолгоОднако если я хочу что-то вернуть, мне нужно получить результат выполнения AsyncTask. Как я могу это сделать?

Я пробовал это (согласно подтвержденному ответу) :

public class Repository {
    private long result_id = 0;
    public long insertSearch(Search search) {
        new insertSearchAsyncTask(this.mSearchDao).execute(search);
        return result_id;
    }

    private class insertSearchAsyncTask extends AsyncTask<Search, Void, Long> {

        private SearchDao mAsyncTaskDao;

        insertSearchAsyncTask(SearchDao dao) {
            this.mAsyncTaskDao = dao;
        }

        @Override
        protected Long doInBackground(final Search... params) {
            long id = this.mAsyncTaskDao.insert(params[0]);
            return id;
        }

        @Override
        protected void onPostExecute(Long search_id) {
            result_id = search_id;
        }

    }
}

Ноэто выглядит очень очень неправильно. Мне пришлось сделать класс insertSearchAsyncTask нестатичным, и я должен сохранить результат вставки в атрибуте моего репозитория.Я надеюсь, что есть лучший / правильный способ сделать это.

Я также посмотрел другие предложенные ответы по ссылке выше, особенно один о делегатах, но это не соответствует моим потребностям, так как янужен метод insertSearch для возврата результата, а не другой, вызываемый AsyncTask, когда он завершается.

Надеюсь, я достаточно ясно объяснил свою проблему.Любая идея кто-нибудь?

Спасибо большое !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...