gpt4 book ai didi

java - Room - 如何正确/有效地进行需要执行另一个表中的数据的查询

转载 作者:行者123 更新时间:2023-12-01 18:32:56 24 4
gpt4 key购买 nike

上下文

在我正在构建的应用程序中,我的数据库中有两个表:- 第一个填充了USERS:

@Entity(tableName = "table_User")
public class User {

@PrimaryKey (autoGenerate = true)
private int id = 0;

@ColumnInfo(name = "firstName")
private String firstName;

@ColumnInfo(name = "lastName")
private String lastName;

@ColumnInfo(name = "soprannome")
@NonNull
private String soprannome;
  • 在第二个中,我需要存储几个用户(按天组织),我保存了用户的ID:
   @Entity(tableName = "table_Couple")
public class Couple {

@ColumnInfo(name = "user_1")
private Integer id_user_1;

@ColumnInfo(name = "user_2")
private Integer id_user_2;

@ColumnInfo(name = "day")
private int day;

@PrimaryKey (autoGenerate = true)
private Integer id;

由于应用程序非常小,我有一个独特的ViewModel,一个存储库,我用它来组织对Dao的调用并执行对数据库的实际调用

我的具体问题

我需要获取出现在COUPLES中的用户列表,这些用户具有相同的DAY和将其放入RecyclerView中以显示它们。我已经实现了一个解决方案,但它并不令我满意,因为即使数据量很小,它也很慢而且很草率。

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

调用的方法:

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


public LiveData<List<Allievo>> getUsersById(List<Integer> 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) ;

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

关于java - Room - 如何正确/有效地进行需要执行另一个表中的数据的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60127105/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com