房间查询返回null

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时,我得到一个空值。我可以不执行该活动要执行的操作吗?我的查询语句由于某种原因不正确吗?

Yas*_*jdi 6

来自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对象。

  • 谢谢你。是的,问题出在观察者身上。 (2认同)