Java 在Android Room中,我可以循环浏览所有记录吗

Java 在Android Room中,我可以循环浏览所有记录吗,java,android,sqlite,loops,android-room,Java,Android,Sqlite,Loops,Android Room,大家好,我查看了Android教程中的RoomSQLite,这很不错,但我面临一个小问题 我创建了一个包含两列键和值(两个字符串)的表 关于列表,我制作了几个文件:实体(类)、Dao、数据库、存储库、ViewModel和listview的适配器(回收器)。我很高兴看到一切都与活动/片段一起工作 现在的问题是:是否可以做一些简单的事情,比如获取所有行的键和值并循环它们?? 现在在Dao文件中,我有: @Query("SELECT * FROM key_table ORDER BY id DESC"

大家好,我查看了Android教程中的RoomSQLite,这很不错,但我面临一个小问题

我创建了一个包含两列键和值(两个字符串)的表

关于列表,我制作了几个文件:实体(类)、Dao、数据库、存储库、ViewModel和listview的适配器(回收器)。我很高兴看到一切都与活动/片段一起工作

现在的问题是:是否可以做一些简单的事情,比如获取所有行的键和值并循环它们??

现在在Dao文件中,我有:

@Query("SELECT * FROM key_table ORDER BY id DESC")
LiveData<List<Key>> getAllkeys();
@Query(“按id描述从键表顺序中选择*)
LiveData getAllkeys();
我试图想出一种方法来循环浏览这个LiveData列表,但我发现的唯一一件事是设置一个观察者,等待更改,并为ListView设置适配器clas

我尝试在KeyDao.java文件中添加类似的内容:

@Query("SELECT * FROM key_table ORDER BY id DESC")
List<Key> getKeys();
@Query(“按id描述从键表顺序中选择*)
列出getKeys();
还有KeyRepository.java,我在其中添加了一些代码来调用getKeys();我在刀上加的

public class KeyRepository {
    private KeyDao keyDao;
    private LiveData<List<Key>> allKeys;
    private List<Key> TheKeys;
    public KeyRepository(Application application) {
      KeyDatabase database = KeyDatabase.getInstance(application);
      keyDao = database.keyDao();
      allKeys = keyDao.getAllkeys();
      TheKeys = keyDao.getKeys();
    }

    public void insert(Key key) {
      new InsertKeyAsyncTask(keyDao).execute(key);
    }

    public void update(Key key) {
      new UpdateKeyAsyncTask(keyDao).execute(key);
    }

    public void delete(Key key) {
      new DeleteKeyAsyncTask(keyDao).execute(key);
    }

    public void deleteAllKeys() {
      new DeleteAllKeysAsyncTask(keyDao).execute();
    }

    public LiveData<List<Key>> getAllKeys() {
      return allKeys;
    }
    //I ADDED THIS
    public List<Key>  getKeys() {
      return TheKeys;
    }
// The implementation of the Asyncs ...
公共类密钥存储库{
私钥道;
私有LiveData所有密钥;
私钥列表;
公钥存储库(应用程序){
KeyDatabase=KeyDatabase.getInstance(应用程序);
keyDao=database.keyDao();
allKeys=keyDao.getAllkeys();
TheKeys=keyDao.getKeys();
}
公共无效插入(密钥){
新建InsertKeyAsyncTask(keyDao)。执行(key);
}
公共无效更新(密钥){
新建UpdateKeyAsyncTask(keyDao)。执行(key);
}
公共无效删除(密钥){
新建DeleteKeyAsyncTask(keyDao)。执行(key);
}
public void deleteAllKeys(){
新建DeleteAllKeyAsyncTask(keyDao).execute();
}
公共LiveData getAllKeys(){
返回所有密钥;
}
//我加了这个
公共列表getKeys(){
归还钥匙;
}
//异步的实现。。。
好的,到目前为止,我遇到了一个错误,并按照@Christilyn的建议在DataBuilder中添加了.allowMainThreadQueries(),从而使其正常工作

结果仍然是一个空数组!!我遗漏了什么? 由于对Keyrepository.java文件进行了更改,我试图在其中添加getKeys(),但出现了一个错误,我正在考虑对活动或片段执行类似的操作:

keyViewModel = ViewModelProviders.of(this).get(KeyViewModel.class);
List<Key>  keys = keyViewModel.getKeys();
int s = keys.size();
for(int i=0;i<s; i++){
  Key k;
  k = keys.get(i);
  //... Now we should loop but the getKeys(); doesnt work !! maybe it's a wrong approach
}
keyViewModel=ViewModelProviders.of(this.get)(keyViewModel.class);
List keys=keyViewModel.getKeys();
int s=keys.size();

对于(int i=0;i您在构造函数中错误地为
allKeys
变量赋值。使用
LiveData
您需要如下设置observer

keyDao.getAllkeys().observe(this, new Observer<List<Key>>() {
    @Override
    public void onChanged(@Nullable List<Key> keysFromDB) {
        allKeys = keysFromDB;
    }
});
keyDao.getAllkeys().observe(这是一个新的观察者(){
@凌驾
公共void onChanged(@Nullable List keysFromDB){
allKeys=keysFromDB;
}
});

默认情况下,room不允许您在主线程上执行查询。因此,您必须异步执行此操作并从主线程获取数据。如果确实需要,您可以添加
allowMainThreadQueries()
RoomDatabase.Builder中的
方法
Hey@Christilyn谢谢你的回复,在我的KeyRepository类中,我有两个从android教程克隆的函数,还有更新、插入、删除和扩展async任务,但是getall是在没有async的情况下声明的,我可以在Dao中剥离LiveData吗?你试过
Room.dat吗abaseBuilder(…).allowMainThreadQueries().build()
?@Christilyn好的,到目前为止,我从存储库java文件中获得的exeption已经不存在了,它可以编译,但我得到了一个大小为0的数组。我想我可能有点问题。我还将从KeyRepository.java中获得一些代码。仍然没有解决@Christilyn我按照建议使用异步使它工作,但奇怪的是,它仍然需要allowMainThreadQueries()谢谢你的建议,我在读了你的代码lol后觉得自己太笨了。所以如果我把它放在我的构造函数中,我添加了一个allKeys私有变量,它将进行初始化,但是我需要尝试一下,如果它能工作,我就接受答案。好运气,它确实能工作,但是onChange是异步执行的,所以所有相关的东西都必须是异步的在那一次更改的事件中
keyDao.getAllkeys().observe(this, new Observer<List<Key>>() {
    @Override
    public void onChanged(@Nullable List<Key> keysFromDB) {
        allKeys = keysFromDB;
    }
});