Мне пришлось создать учетную запись, чтобы задать этот вопрос, потому что я не мог найти правильный способ сделать это.Единственное, что подходит, это этот вопрос здесь , но он не доходит до конца, и я все еще застрял.Вот и мы ...
Я пытаюсь создать приложение, следуя такому же принципу Компоненты архитектуры .В настоящее время я пытаюсь добавить строку в одну из моих таблиц базы данных и получить идентификатор этой строки в ответ, чтобы затем вставить строку в другую таблицу со ссылкой на первую.
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, когда он завершается.
Надеюсь, я достаточно ясно объяснил свою проблему.Любая идея кто-нибудь?
Спасибо большое !!