我正在尝试确定我的数据库中是否存在具有特定ID的项目,但即使我知道它在数据库中,我仍然会变为null。我很确定我错误地定义了我的查询,但我不确定问题是什么。我一直在查看房间查询示例,但无法解决问题。当我尝试打印查询日志时,除了空指针异常外,我没有看到任何错误。
我在DAO中尝试的查询看起来像这样:
@Query("select filmID from FilmDataModel where filmID = :currentId")
LiveData<String> inDatabase(String currentId);
我的视图模型使用此方法充当UI和DAO之间的路径:
public LiveData<String> inDatabase(String currentID) {
LiveData<String> filmID = filmDatabase.filmDao().inDatabase(currentID);
return filmID;
}
我的FilmDataModel对象定义如下:
@Entity public class FilmDataModel {
@PrimaryKey(autoGenerate = true)
public int id;
@ColumnInfo(name = "posterURL")
private String posterURL;
private String releaseDate;
@ColumnInfo(name = "voterAvg")
private String voterAvg;
@ColumnInfo(name = "description")
private String description;
@ColumnInfo(name = "title")
private String title;
@ColumnInfo(name = "filmID")
private String filmId;
public FilmDataModel(String posterURL, String releaseDate, String voterAvg, String description,
String title, String filmId) {
this.posterURL = posterURL;
this.releaseDate = releaseDate;
this.voterAvg = voterAvg;
this.description = description;
this.title = title;
this.filmId = filmId;
}
public String getPosterURL() {
return this.posterURL;
}
public String getReleaseDate() {
return releaseDate;
}
public String getDescription() {
return description;
}
public String getFilmId() {
return filmId;
}
public String getTitle() {
return title;
}
public String getVoterAvg() {
return voterAvg;
}
}
然后,在我的Activity中,我点击按钮设置以下代码:
favoriteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d(TAG, "Favorite button pressed.");
FilmDataModel filmDataModel = new FilmDataModel(posterURL, releaseDate, voterAvg,
overview, title, id);
if (favoriteSelected) {
Log.d(TAG, "Delete Item.");
favoriteSelected = false;
favoriteButton.setImageResource(R.drawable.heart_icon_off);
viewModel.deleteItem(filmDataModel);
} else {
Log.d(TAG, "Insert Item.");
favoriteSelected = true;
favoriteButton.setImageResource(R.drawable.heart_icon_on);
viewModel.insertItem(filmDataModel);
Log.d(TAG, viewModel.inDatabase(id).getValue());
}
}
});
看起来数据被插入数据库并根据活动和视图模型中的print语句从数据库ok中删除但是当我尝试运行查询并打印filmID时,我得到一个null。我可以不从活动中做我想做的事吗?我的查询语句出于某种原因是否不正确?
答案 0 :(得分:3)
来自Android Developers documentation:
LiveData是可以在给定范围内观察到的数据持有者类 生命周期
这意味着您必须先注册Observer
才能接收数据更新。
同样,来自Android Developers documentation:
通常,LiveData仅在数据更改时才提供更新,并且仅 给积极的观察者。这种行为的一个例外是观察者 当它们从非活动状态更改为活动状态时,也会收到更新 州。此外,如果观察者从非活动状态变为活动状态, 第二次,如果值自 它最后一次启用。
这是一个可能的解决方案:
favoriteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d(TAG, "Favorite button pressed.");
FilmDataModel filmDataModel = new FilmDataModel(posterURL, releaseDate, voterAvg, overview, title, id);
if (favoriteSelected) {
Log.d(TAG, "Delete Item.");
} else {
Log.d(TAG, "Insert Item.");
favoriteSelected = true;
favoriteButton.setImageResource(R.drawable.heart_icon_on);
viewModel.insertItem(filmDataModel);
viewModel.inDatabase(id).observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable final String name) {
// your code here
Log.d(TAG, name.getValue());
}
});
}
}
});
有关更多信息,请参见Work with LiveData objects