Ind*_*ndy 6 android android-room android-architecture-components
我正在尝试确定数据库中是否存在具有特定ID的项目,但是即使我知道它在数据库中,我仍会得到null。我很确定自己定义的查询不正确,但不确定是什么问题。我一直在查看“房间”查询示例,但无法解决该问题。我在运行代码时没有看到任何错误,除了在尝试打印查询日志时出现空指针异常。
我正在DAO中尝试执行的查询如下所示:
@Query("select filmID from FilmDataModel where filmID = :currentId")
LiveData<String> inDatabase(String currentId);
Run Code Online (Sandbox Code Playgroud)
我的视图模型使用这种方法充当UI和DAO之间的过渡:
public LiveData<String> inDatabase(String currentID) {
LiveData<String> filmID = filmDatabase.filmDao().inDatabase(currentID);
return filmID;
}
Run Code Online (Sandbox Code Playgroud)
我的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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的活动中,将以下代码设置为单击按钮:
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());
}
}
});
Run Code Online (Sandbox Code Playgroud)
看起来数据是基于活动和视图模型的打印语句插入数据库的,然后从数据库中删除了,但是当我尝试运行查询并打印filmID时,我得到一个空值。我可以不执行该活动要执行的操作吗?我的查询语句由于某种原因不正确吗?
来自Android开发者文档:
LiveData是可以在给定生命周期内观察到的数据持有者类
这意味着您必须先注册Observer才能接收数据更新。
同样,来自Android开发者文档:
通常,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());
}
});
}
}
});
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参见使用LiveData对象。
| 归档时间: |
|
| 查看次数: |
5962 次 |
| 最近记录: |