web-dev-qa-db-ja.com

ルームクエリがnullを返します

特定のIDのアイテムがデータベースに存在するかどうかを確認しようとしていますが、データベースに存在することがわかっていてもnullを取得し続けます。クエリを誤って定義していることは確かですが、問題が何であるかはわかりません。 Roomクエリの例を確認しましたが、問題を解決できませんでした。クエリのログを印刷しようとしたときの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;
    } 
}

次に、私のアクティビティから、ボタンをクリックして次のコードを設定します。

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());
        }
    }
});

データがデータベースに挿入され、データベースから削除されたようです。アクティビティとビューモデルの印刷ステートメントに基づいて問題ありませんが、クエリを実行してfilmIDを印刷しようとすると、nullが返されます。アクティビティから実行しようとしていることを実行できませんか?なんらかの理由でクエリステートメントが正しくありませんか?

8
Indy

Android Developersのドキュメント から:

LiveDataは、特定のライフサイクル内で監視できるデータホルダークラスです。

つまり、データの更新を受信するには、最初にObserverを登録する必要があります。

繰り返しますが、 Android Developersのドキュメント から:

通常、LiveDataは、データが変更されたときにのみ、アクティブなオブザーバーにのみ更新を配信します。この動作の例外は、オブザーバーが非アクティブ状態からアクティブ状態に変化したときにも更新を受け取ることです。さらに、オブザーバーが2度目に非アクティブからアクティブに変更された場合、最後にアクティブになってから値が変更された場合にのみ、オブザーバーは更新を受け取ります。

これが可能な解決策です:

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());
                }
            });
        }
    }
});

詳細については、「 LiveDataオブジェクトの操作 」を参照してください。

6
Yassin Ajdi