web-dev-qa-db-fra.com

La requête de pièce renvoie null

J'essaie de déterminer si un élément avec un certain ID existe dans ma base de données, mais je continue à obtenir null même si je sais qu'il se trouve dans la base de données. Je suis sûr de ne pas définir correctement ma requête, mais je ne sais pas quel est le problème. J'ai regardé des exemples de requêtes de salle, mais je n'ai pas pu résoudre le problème. Je ne vois aucun bogue lorsque j'exécute le code, à l'exception d'une exception de pointeur nul lorsque j'essaie d'imprimer le journal de la requête.

La requête que j'essaie de faire dans DAO ressemble à ceci:

    @Query("select filmID from FilmDataModel where filmID = :currentId")
    LiveData<String> inDatabase(String currentId);

Mon modèle de vue a cette méthode pour servir d'intermédiaire entre l'interface utilisateur et le DAO:

public LiveData<String> inDatabase(String currentID) {
        LiveData<String> filmID = filmDatabase.filmDao().inDatabase(currentID);
        return filmID;
    }

Mon objet FilmDataModel est défini comme suit:

@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;
    } 
}

Ensuite, à partir de mon activité, j'ai défini le code suivant sur un clic de bouton:

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

Il semble que les données soient insérées dans la base de données et supprimées de la base de données ok en fonction des instructions d'impression de l'activité et du modèle de vue, mais lorsque j'essaie d'exécuter la requête et d'imprimer le filmID, j'obtiens une valeur nulle. Puis-je ne pas faire ce que j'essaie de faire de l'activité? Ma déclaration de requête est-elle incorrecte pour une raison quelconque?

8
Indy

De documentation des développeurs Android :

LiveData est une classe de détenteurs de données qui peut être observée dans un cycle de vie donné

ce qui signifie que vous devrez d'abord enregistrer un Observer pour recevoir les mises à jour des données.

Encore une fois, à partir de documentation des développeurs Android :

En règle générale, LiveData fournit des mises à jour uniquement lorsque les données changent, et uniquement aux observateurs actifs. Une exception à ce comportement est que les observateurs reçoivent également une mise à jour lorsqu'ils passent d'un état inactif à un état actif. De plus, si l'observateur passe d'inactif à actif une deuxième fois, il ne reçoit une mise à jour que si la valeur a changé depuis la dernière fois qu'il est devenu actif.

Voici une solution possible:

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

Pour plus d'informations, consultez Travailler avec des objets LiveData

6
Yassin Ajdi