gpt4 book ai didi

android - LiveData.getValue() 使用 Room 返回 null

转载 作者:IT老高 更新时间:2023-10-28 23:05:16 28 4
gpt4 key购买 nike

Java POJO 对象

public class Section {

@ColumnInfo(name="section_id")
public int mSectionId;

@ColumnInfo(name="section_name")
public String mSectionName;

public int getSectionId() {
return mSectionId;
}

public void setSectionId(int mSectionId) {
this.mSectionId = mSectionId;
}

public String getSectionName() {
return mSectionName;
}

public void setSectionName(String mSectionName) {
this.mSectionName = mSectionName;
}
}

我的查询方法

@Query("SELECT * FROM section")
LiveData<List<Section>> getAllSections();

访问数据库

final LiveData<List<Section>> sections = mDb.sectionDAO().getAllSections();

在下一行我正在检查 sections.getValue() 尽管我在数据库中有数据,但它总是给我 null,后来我在 onChanged() 中获得了值 方法。

sections.observe(this, new Observer<List<Section>>() {
@Override
public void onChanged(@Nullable List<Section> sections){

}
});

但是当我从查询中省略 LiveData 时,我得到了预期的数据。查询方法:

@Query("SELECT * FROM section")
List<Section> getAllSections();

访问数据库:

final List<Section> sections = mDb.sectionDAO().getAllSections();

最佳答案

在下一行,我正在检查sections.getValue(),尽管我在DataBase 中有数据,但它总是给我null,后来我在onChanged() 方法中获取了值。

这是正常行为,因为返回 LiveData 的查询是异步工作的。那时该值为 null。

所以调用这个方法

LiveData<List<Section>> getAllSections();

你稍后会在这里得到结果

sections.observe(this, new Observer<List<Section>>() {
@Override
public void onChanged(@Nullable List<Section> sections){

}
});

来自文档:

Room 不允许在主线程上访问数据库,除非您在构建器上调用 allowMainThreadQueries(),因为它可能会长时间锁定 UI。异步查询(返回 LiveData 或 RxJava Flowable 的查询)不受此规则约束,因为它们会在需要时在后台线程上异步运行查询。

关于android - LiveData.getValue() 使用 Room 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44428389/

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