2 votes

Exception Nullpointer sur la valeur de retour d'une méthode DAO

Je suis en train d'utiliser une Roomdatabase et je souhaite chercher un seul objet dans la base de données lorsque je lui donne son nom. Pour cela, j'ai écrit cette requête dans le DAO :

 @Query("SELECT * FROM kuh_table WHERE name = :kuhName ")
    Kuh findKuh(String kuhName);

Je l'appelle dans le référentiel de cette manière :

public Kuh findKuh(String kuhName){
        final Kuh[] kuh = new Kuh[1];
        new Thread(new Runnable() {
            volatile boolean running = true;
            @Override
            public void run() {
                if(running!= true) {
                    return;
                }
                kuh[0] =kuhDAO.findKuh(kuhName);
                running = false;
            }
        }).start();
        return kuh[0];
    }

ensuite dans mon ViewModel de cette manière :

public Kuh findKuh(String kuhName){ return repository.findKuh(kuhName);}

Ensuite, j'initialise mon ViewModel dans un fragment et j'essaie d'utiliser la méthode en donnant une chaîne de caractères comme ceci :

MarkerApiKt.setMarkerTapListener(mapView, (MarkerTapListener) (new MarkerTapListener() {
                public void onMarkerTap(@NotNull View view, int x, int y) {
                    Intrinsics.checkNotNullParameter(view, "view");
                    if (view instanceof MapMarker) {
                        MarkerCallout callout = new MarkerCallout(context);
                        callout.setTitle(((MapMarker) view).getName());
                        callout.setSubTitle("position: " + ((MapMarker) view).getX() + " , " + ((MapMarker) view).getY());
                        Kuh kuh = kuhViewModel.findKuh(((MapMarker) view).getName());
                        Toast.makeText(context, "this is "+ kuh.getName(), Toast.LENGTH_SHORT).show();

mais d'une manière ou d'une autre, l'instance de mon objet est toujours nulle car je me retrouve avec une exception de pointeur nul. Avez-vous une idée de ce que je pourrais faire de travers ?

2voto

Hédi Guellouz Points 75

Donc, comme l'a dit @Olli, le problème était que mon thread dans mon Repository n'avait pas terminé son exécution, ce qui explique pourquoi il a renvoyé un objet nul.

J'ai simplement modifié mon code de cette manière et maintenant ça fonctionne bien

public Kuh findKuh(String kuhName) throws InterruptedException {
        final Kuh[] kuh = new Kuh[1];
        Thread t1 = new Thread(new Runnable() {
            volatile boolean running = true;
            @Override
            public void run() {
                if(running!= true) {
                    return;
                }
                kuh[0] =kuhDAO.findKuh(kuhName);
                running = false;
            }
        });
        t1.start();
        t1.join();
        return kuh[0];
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X