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