房间查询返回null

时间:2018-06-13 18:36:06

标签: android android-room android-architecture-components

我正在尝试确定我的数据库中是否存在具有特定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。我可以不从活动中做我想做的事吗?我的查询语句出于某种原因是否不正确?

1 个答案:

答案 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