Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 房间-如何正确/高效地进行需要执行另一个表中数据的查询_Java_Android_Android Room_Android Livedata - Fatal编程技术网

Java 房间-如何正确/高效地进行需要执行另一个表中数据的查询

Java 房间-如何正确/高效地进行需要执行另一个表中数据的查询,java,android,android-room,android-livedata,Java,Android,Android Room,Android Livedata,上下文 在我正在构建的应用程序中,我的数据库中有两个表: -第一个是用户: 在第二个示例中,我需要存储几对用户(按天组织),我会保存用户的ID: 由于应用程序非常小,我有一个独特的ViewModel,一个存储库,我用它来组织对Dao的调用并执行对数据库的实际调用 我的具体问题 我需要获得一个出现在同一天的情侣中的用户列表,并将其放入回收视图中显示给他们。 我已经找到了一个解决方案,但这并不能让我满意,因为即使只有少量的数据,也会变得缓慢和草率 private List<Coupl

上下文

在我正在构建的应用程序中,我的数据库中有两个表: -第一个是用户:

  • 在第二个示例中,我需要存储几对用户(按天组织),我会保存用户的ID:
由于应用程序非常小,我有一个独特的ViewModel,一个存储库,我用它来组织对Dao的调用并执行对数据库的实际调用

我的具体问题

我需要获得一个出现在同一天的情侣中的用户列表,并将其放入回收视图中显示给他们。 我已经找到了一个解决方案,但这并不能让我满意,因为即使只有少量的数据,也会变得缓慢和草率

   private List<Couple> CoupleList;

   mViewModel = new ViewModelProvider(this).get(ViewModel.class);

    //Here we make the call to get all the couple **ON THE MAIN THREAD, WITHOUT USING LIVEDATA**
    couplesList = mWordViewModel.getCouplesByDay(fragmentDayId); 

    //Parsing from *list* of *COUPLES* to *list* of *INT*
    List<Integer> CouplesListParsed = new ArrayList<Integer>();
    for (Couple eq : CouplesList){
        couplesListParsed.add(eq.getId_user_1());
        couplesListParsed.add(eq.getId_user_2());
    }

    // Add an observer on the LiveData
    mWordViewModel.getUsersById(CoupleListParsed).observe(this, new Observer<List<Users>>() {
        @Override
        public void onChanged(@Nullable final List<User> users) {
            // Update the cached copy of the users in the adapter.
            adapter.setWords(users);
        }
    });
私有列表;
mViewModel=newviewmodelprovider(this.get)(ViewModel.class);
//在这里,我们调用来获取主线程上的所有耦合**,而不使用LIVEDATA**
couplesList=mWordViewModel.getCouplesByDay(fragmentDayId);
//从*对*的*列表*到*INT的*列表*进行分析*
List CouplesListParsed=new ArrayList();
用于(耦合等式:耦合列表){
couplesListParsed.add(等式getId_user_1());
couplesListParsed.add(等式getId_user_2());
}
//在LiveData上添加一个观察者
mWordViewModel.getUsersById(CoupleListParsed).observe(这是新的观察者(){
@凌驾
公共void onChanged(@Nullable final List users){
//更新适配器中用户的缓存副本。
adapter.setWords(用户);
}
});
调用的方法:

    public List<Equipaggio> getCouplesByDay( Integer dayId) { return mRepository.getCouplesByDay(dayId); }


    public LiveData<List<Allievo>> getUsersById(List<Integer> id) { return mRepository.getUsersById(id); }
public List getCouplesByDay(Integer dayId){return mRepository.getCouplesByDay(dayId);}
public LiveData getUsersById(列表id){return mRepository.getUsersById(id);}
我很确定我的问题来自于主线程上的数据库查询getEquipaggiByDay,但我不知道如何修复它,因为让它成为LiveData似乎没有意义,调用新线程对我来说也不是真正的解决方案

实际问题

因此,我的问题可以归结为:如何正确/高效地进行需要从另一个表执行数据的查询

这是我的第一个问题,所以请对我放轻松,如果我报告的代码中缺少什么,请随时指出。
此外,我开始担心可能会出现一些更大的“架构”问题或一些糟糕的实践,也可以随意指出这些问题。

因此,多亏了Pawel的回答,我得到了一个更好的结果,多亏了这个查询:

    @Query("SELECT DISTINCT * " +
        "FROM table_users AS al INNER JOIN table_couples AS eq" +
        " ON al.userId=eq.user_1 OR al.userId=eq.user_2" +
        " WHERE day=:dayId")
    LiveData<List<Allievo>> getUsersByCouplesByDay(Integer dayId) ;
@Query(“选择不同的*”+
“来自表用户作为所有内部联接表用户作为eq”+
“在al.userId=eq.user_1或al.userId=eq.user_2上”+
“其中日期=:dayId”)
LiveData getUsersByCouplesByDay(整数dayId);

为了能够执行此查询,我修改了我的类,添加了所需的外键和索引。

您可能希望将用户1和2 ID定义为外键,并运行联接查询。也许这个问题的其中一个答案会有所帮助:谢谢你,先生。我将尝试发布我的结果。
    public List<Equipaggio> getCouplesByDay( Integer dayId) { return mRepository.getCouplesByDay(dayId); }


    public LiveData<List<Allievo>> getUsersById(List<Integer> id) { return mRepository.getUsersById(id); }
    @Query("SELECT DISTINCT * " +
        "FROM table_users AS al INNER JOIN table_couples AS eq" +
        " ON al.userId=eq.user_1 OR al.userId=eq.user_2" +
        " WHERE day=:dayId")
    LiveData<List<Allievo>> getUsersByCouplesByDay(Integer dayId) ;