【问题标题】:Queries with arguments in Android Studio - RoomAndroid Studio 中带参数的查询 - Room
【发布时间】:2020-03-27 17:24:55
【问题描述】:

我想查询一个家庭中的所有鸟类,但我不知道该怎么做。到目前为止我已经这样做了,但我觉得我错过了一些东西:

道:

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

        });

【问题讨论】:

  • 您有什么问题,我们需要更多详细信息
  • 您的问题到底是什么?我注意到您的ViewModel 中有一个小错误,您不需要getAllBirdsFromFamily 中的变量,因为它返回您的LiveData,您是如何在后台管理查询的?
  • 你的family字符串可能为空,应该是MutableLiveData&lt;String&gt; switchMapped到Dao Query方法中
  • @Biscuit 我没有这个查询的doInBackGround,我应该怎么做?
  • @EpicPandaForce 这就是我的想法,但调试器在单击上一个家庭项目时找到了我想要的正确字符串

标签: java android database android-asynctask android-room


【解决方案1】:

由于我的评论有点长,我会发一个帖子。

我没有这个查询的doInBackGround,我应该怎么做?

是的,当您查询数据库时,您希望避免使用主线程有两个原因,第一个原因是您会收到来自 Android 的崩溃,告诉您不要这样做。第二个是让您的用户在您的应用程序完成获取数据的工作时与它进行交互。

在此doc 中,您可以查看示例和 Codelab,并了解如何正确调用数据库。

【讨论】:

    【解决方案2】:

    我通过工厂解决了它 - doInBackground 不是必需的,因为它只是一个“获取”查询:

    道:

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

    【讨论】:

      猜你喜欢
      • 2019-02-01
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      相关资源
      最近更新 更多