java - 在 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 而无需设置观察者并等待更改?
解决方案
您allKeys
在构造函数中错误地为变量赋值。LiveData
您需要如下设置观察者。
keyDao.getAllkeys().observe(this, new Observer<List<Key>>() {
@Override
public void onChanged(@Nullable List<Key> keysFromDB) {
allKeys = keysFromDB;
}
});
推荐阅读
- java - 我想在我的 html 标签中的 android web 视图中使用呼叫按钮
- php - 如何将延迟属性添加到wordpress中的所有排队样式表?
- testing - 如何模拟 s3ObjectStream
- r - `$<-.data.frame`(`*tmp*`, Predict, value = c(`1` = 1L, `2` = 1L, : 替换有 3500 行,数据有 1500
- sql - 如何通过 informatica 使用 sysdate 删除记录器
- php - 如何从存储在另一个 php 文件中的函数返回变量?
- python - 错误 conda.core.link:_execute(700): 安装包 'defaults::qt-5.9.7-vc14h73c81de_0' 时出错
- regex - 匹配赞比亚 NRC 号码的正则表达式模式是什么
- aws-sdk - Amazon SQS 侦听器 - 在消息失败之前使用消息并设置属性
- angular - 创建 Angular 项目时出错“无法加载,因为在此系统上禁用了运行脚本。”