Room 数据库中的 List<> 始终为空
List<> from Room Database is always null
以下 classes 用于在 Room 数据库中存储调查列表。 LiveData 用于更新
数据库的实体 class:
@Entity
public class Survey {
@PrimaryKey
@NonNull
private String surveyID;
private String surveyName;
private String url;
private double lat;
private double lng;
private double radius;
public Survey(String surveyID, String surveyName, double lat, double lng, double radius, String url) {
this.surveyID = surveyID;
this.surveyName = surveyName;
this.lat = lat;
this.lng = lng;
this.radius = radius;
this.url = url;
}
各自的 Dao 接口:
@Dao
public interface SurveyDao {
@Query("SELECT * FROM Survey")
LiveData<List<Survey>> getListOfSurveys();
/* Rest omitted */
}
各自的存储库class
public class SurveyRepository {
private final SurveyDao surveyDao;
@Inject
public SurveyRepository (SurveyDao surveyDao){
this.surveyDao = surveyDao;
}
public LiveData<List<Survey>> getListOfSurveys(){
return surveyDao.getListOfSurveys();
}
/* Rest omitted */
}
视图模型:
public class SurveyCollectionViewModule extends ViewModel {
private SurveyRepository repository;
public SurveyCollectionViewModule(SurveyRepository repository) {
this.repository = repository;
}
public LiveData<List<Survey>> getSurveys(){
return repository.getListOfSurveys();
}
/* Rest Omitted */
}
使用所有这些,我设置了一个片段,其中有一个显示调查列表的 RecyclerView。列表获取方式如下:
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
surveyCollectionViewModule = ViewModelProviders.of(this, viewModelFactory)
.get(SurveyCollectionViewModule.class);
surveyCollectionViewModule.getSurveys().observe(this, new Observer<List<Survey>>() {
@Override
public void onChanged(@Nullable List<Survey> surveys) {
if(SurveyListFragment.this.listOfSurveys == null) {
setSurveyData(listOfSurveys);
}
}
});
}
但是,我 运行 遇到了这个问题,在适配器中调用 getItemCount()
失败,因为这个列表是 NULL
。数据库不包含任何条目,但我仍然不知道为什么列表总是返回 null。
您的 onChanged
实际上并没有使用给定的 surveys
参数,将其更改为调用 setSurveyData(surveys)
以实际填写您的数据。
在 ViewModel 中进行一些更改 class 如下所示...
private final LiveData<List<Survey>> SurveyList;
private AppDatabase appDatabase;
public SurveyCollectionViewModule(Application application) {
appDatabase = AppDatabase.getDatabase(this.getApplication());
SurveyList = appDatabase.surveyDao().getAllSurvey();
}
public LiveData<List<Survey>> getSurveys() {
return SurveyList;
}
以下 classes 用于在 Room 数据库中存储调查列表。 LiveData 用于更新
数据库的实体 class:
@Entity
public class Survey {
@PrimaryKey
@NonNull
private String surveyID;
private String surveyName;
private String url;
private double lat;
private double lng;
private double radius;
public Survey(String surveyID, String surveyName, double lat, double lng, double radius, String url) {
this.surveyID = surveyID;
this.surveyName = surveyName;
this.lat = lat;
this.lng = lng;
this.radius = radius;
this.url = url;
}
各自的 Dao 接口:
@Dao
public interface SurveyDao {
@Query("SELECT * FROM Survey")
LiveData<List<Survey>> getListOfSurveys();
/* Rest omitted */
}
各自的存储库class
public class SurveyRepository {
private final SurveyDao surveyDao;
@Inject
public SurveyRepository (SurveyDao surveyDao){
this.surveyDao = surveyDao;
}
public LiveData<List<Survey>> getListOfSurveys(){
return surveyDao.getListOfSurveys();
}
/* Rest omitted */
}
视图模型:
public class SurveyCollectionViewModule extends ViewModel {
private SurveyRepository repository;
public SurveyCollectionViewModule(SurveyRepository repository) {
this.repository = repository;
}
public LiveData<List<Survey>> getSurveys(){
return repository.getListOfSurveys();
}
/* Rest Omitted */
}
使用所有这些,我设置了一个片段,其中有一个显示调查列表的 RecyclerView。列表获取方式如下:
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
surveyCollectionViewModule = ViewModelProviders.of(this, viewModelFactory)
.get(SurveyCollectionViewModule.class);
surveyCollectionViewModule.getSurveys().observe(this, new Observer<List<Survey>>() {
@Override
public void onChanged(@Nullable List<Survey> surveys) {
if(SurveyListFragment.this.listOfSurveys == null) {
setSurveyData(listOfSurveys);
}
}
});
}
但是,我 运行 遇到了这个问题,在适配器中调用 getItemCount()
失败,因为这个列表是 NULL
。数据库不包含任何条目,但我仍然不知道为什么列表总是返回 null。
您的 onChanged
实际上并没有使用给定的 surveys
参数,将其更改为调用 setSurveyData(surveys)
以实际填写您的数据。
在 ViewModel 中进行一些更改 class 如下所示...
private final LiveData<List<Survey>> SurveyList;
private AppDatabase appDatabase;
public SurveyCollectionViewModule(Application application) {
appDatabase = AppDatabase.getDatabase(this.getApplication());
SurveyList = appDatabase.surveyDao().getAllSurvey();
}
public LiveData<List<Survey>> getSurveys() {
return SurveyList;
}