Запросы с аргументами в Android Studio - Комната - PullRequest
0 голосов
/ 27 марта 2020

Я хочу сделать Запрос, чтобы собрать всех птиц в семье, и я не уверен, как это сделать. Я уже сделал это, но чувствую, что что-то упустил:

DAO:

@Query("Select * from bird WHERE family=:family")
public LiveData<List<Bird>> getBirdsFromFamily(String family);

Репозиторий:

private LiveData<List<Bird>> allBirdsFromFamily;

private String family;

public BirdRepository(Application application){
    Database database = Database.getInstance(application);
    dao = database.dao();


    allBirdsFromFamily = dao.getBirdsFromFamily(family);
}


public LiveData<List<Bird>> getBirdsFromFamily(String family){
    return allBirdsFromFamily; 
}

Просмотр модели:

private LiveData<List<Bird>> allBirdsFromFamily;

private String family;


public BirdViewModel(@NonNull Application application) {
    super(application);
    birdRepository = new BirdRepository(application);

    allBirdsFromFamily = birdRepository.getBirdsFromFamily(family);

}


public LiveData<List<Bird>> getAllBirdsFromFamily(String family)
{
    return allBirdsFromFamily;
}

У меня есть список семей и список птиц.

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

    String family = intent.getStringExtra(AddEditFamilyActivity.EXTRA_FAMILY);

        birdViewModel.getAllBirdsFromFamily(family).observe(this, new Observer<List<Bird>>() {

            @Override
            public void onChanged(@Nullable List<Bird> birds) { //everytime something changes, the adaptater is updated
                //update the recycler view
                adapter.submitList(birds);
            }

        });

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Я решил это с фабрикой - doInBackground не был необходим, потому что это всего лишь запрос "get":

DAO:

@Query("Select * from bird WHERE family=:family ORDER BY name")
public LiveData<List<Bird>> getBirdsFromFamily(String family);

Репозиторий:

private LiveData<List<Bird>> allBirdsFromFamily;
private String family;

public BirdRepository(Application application){
    Database database = Database.getInstance(application);
    birdDao = database.dao();

    allBirdsFromFamily = birdDao.getBirdsFromFamily(family);
}


public LiveData<List<Bird>> getAllBirdsFromFamily(String family){
    return birdDao.getBirdsFromFamily(family);
}

ViewModel:

       private LiveData<List<Bird>> allBirdsFromFamily;
          private BirdRepository repository;

            public BirdViewModel(@NonNull Application application, String family ) {
                super(application);
                this.application = application;

                repository = new BirdRepository(application);
    allBirdsFromFamily = repository.getAllBirdsFromFamily(family);
            }    

        public LiveData<List<Bird>> getAllBirdsFromFamily(String family) { return repository.getAllBirdsFromFamily(family); }

ViewModelFactory:

    private Application mApplication;
    private String mfamily;

    public BirdViewModelFactory(@NonNull Application application, String family) {
        mApplication = application;
        mfamily = family;
    }

    @NonNull
    @Override
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        return (T) new BirdViewModel(mApplication, mfamily);
    }

Активность:

     BirdViewModelFactory factory = new BirdViewModelFactory(this.getApplication(), family);
     birdViewModel = new ViewModelProvider(this, factory).get(BirdViewModel.class);
0 голосов
/ 27 марта 2020

Поскольку мой комментарий немного длинный, я сделаю пост.

У меня нет doInBackGround для этого запроса, как мне это сделать?

Да, когда вы отправляете запрос в базу данных, вы хотите избежать использования основного потока по двум причинам, первая из них заключается в том, что вы получите cra * sh из Android, который говорит вам не делать этого. И второе - позволить вашему пользователю взаимодействовать с вашим приложением, пока оно выполняет работу по получению данных.

В этом do c вы можете посмотреть образцы и кодовые метки и научиться правильно обращаться к базе данных.

...