首页 > 解决方案 > 在 Android Room 中,我可以循环浏览所有记录吗

问题描述

大家好,所以我查看了 Room Sqlite 的 Android 教程,这很好,但我遇到了一个小问题。

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

@Entity(tableName = "key_table")
public class Key {
@PrimaryKey(autoGenerate = true)
private int id;
private String key;
private String value;
//...Setters and getters and contructor 

关于谷歌文档,我制作了几个文件:实体(类)、道、数据库、存储库、视图模型、列表视图的适配器(回收器)。我很高兴看到一切都与 Activity/Fragment 一起工作。

现在的问题:是否可以做一些简单的事情,比如获取所有行 KEYS & VALUES 并遍历它们?

现在在 Dao 文件中,我有:

@Query("SELECT * FROM key_table ORDER BY id DESC")
LiveData<List<Key>> getAllkeys();

我试图想出一种方法来循环遍历这个 LiveData List,但我发现的唯一一件事是设置一个观察者并等待更改和设置 ListView 的适配器类。

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

@Query("SELECT * FROM key_table ORDER BY id DESC")
List<Key> 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 ...

好的,到目前为止,我得到了一个错误,并通过在 @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
}

那么我们是否可以只循环遍历应该封装数据的 LiveData 而无需设置观察者并等待更改?

标签: javaandroidsqliteloopsandroid-room

解决方案


allKeys在构造函数中错误地为变量赋值。LiveData您需要如下设置观察者。

keyDao.getAllkeys().observe(this, new Observer<List<Key>>() {
    @Override
    public void onChanged(@Nullable List<Key> keysFromDB) {
        allKeys = keysFromDB;
    }
});

推荐阅读