有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Android Studio Room中带参数的java查询

我想问一个问题,让所有的鸟都在一个家庭,我不知道如何做到这一点。到目前为止,我已经做到了这一点,但我觉得我遗漏了一些东西:

道:

@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) 个答案

  1. # 1 楼答案

    由于我的评论有点长,我将发表一篇文章

    I don't have any doInBackGround for this query, how should I do it ?

    是的,当您查询数据库时,出于两个原因希望避免使用主线程,第一个原因是因为Android会让您崩溃,告诉您不要这样做。第二种方法是让用户在获取数据的同时与应用程序交互

    在本doc中,您可以查看示例和代码实验室,并学习如何正确调用数据库

  2. # 2 楼答案

    我用一个工厂解决了这个问题-没有必要使用doInBackground,因为它只是一个“get”查询:

    道:

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

    视图模型:

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