2017-12-07 4 views
1

Ich möchte alle Herausforderungen in Firestore und Schleife über das Ergebnis erhalten, um es zu einer ArrayList hinzuzufügen.Null Objektreferenz in Firebase Ergebnisschleife

db.collection("challenges") 
     .get() 
     .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { 
      @Override 
      public void onComplete(@NonNull Task<QuerySnapshot> task) { 
       if (task.isSuccessful()) { 
        for (DocumentSnapshot document : task.getResult()) { 
         if (document.exists()) { 
          Log.d(TAG, document.getId() + " => " + document.getData()); 
        Error-> Challenge challenge = document.toObject(Challenge.class); 
          Log.d(TAG, challenge.getUid() + " => " + challenge.getText()); 
          challengeList.add(document.getData().toString()); 
         } 
        } 

        challengeListView.setAdapter(challengeArrayAdapter); 
       } else { 
        Log.d(TAG, "Error getting documents: ", task.getException()); 
       } 
      } 
     }); 

Fehler ist:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.lang.reflect.Constructor.newInstance(java.lang.Object[])' on a null object reference 

Line:

Challenge challenge = document.toObject(Challenge.class); 

Das Protokoll mit Log.d(TAG, document.getId() + " => " + document.getData()); arbeitet.

Referenz: https://firebase.google.com/docs/firestore/query-data/get-data#get_all_documents_in_a_collection

Das ist meine meine Challenge Class ist:

public class Challenge { 

    private Date createdAt; 
    private Date changedAt; 
    private String uid; 
    private String text; 
    private double longitude; 
    private double latitude; 

    public Challenge(String uid, String text, double longitude, double latitude) { 
     Date currentDate = new Date(); 
     this.createdAt = currentDate; 
     this.changedAt = currentDate; 
     this.uid = uid; 
     this.text = text; 
     this.longitude = longitude; 
     this.latitude = latitude; } 

    public Date getCreatedAt() { return createdAt; } 

    public Date getChangedAt() { return changedAt; } 

    public String getUid() { return uid; } 

    public String getText() { return text; } 

    public double getLongitude() { return longitude; } 

    public double getLatitude() { return latitude;} 
} 

Antwort

3

Sie müssen diese Codezeile ändern:

Challenge challenge = document.toObject(Challenge.class); 

mit

Map<String, Object> map = task.getResult().getData()); 

toObject() Verfahren für ein einzelnes Dokument zu verwenden, benutzen Sie bitte den folgenden Code verwenden:

DocumentReference docRef = db.collection("challenges").document("yourDocument"); 
docRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() { 
    @Override 
    public void onSuccess(DocumentSnapshot documentSnapshot) { 
     Challenge challenge = documentSnapshot.toObject(Challenge.class); 
    } 
}); 

Der Fehler wegen Ihrer Modellklasse ist. Dein Code sieht gut aus. Fügen Sie in Ihrer Modellklasse den Konstruktor ohne Argumente hinzu. Behalten Sie diesen Code oder verwenden Sie die Map<String, Object> und Ihr Problem wird gelöst.

den Konstruktor ohne Argumente hinzufügen möchten, nutzen Sie bitte die folgende Codezeile in Ihrem Modell-Klasse hinzufügen:

public Challenge() {} //Needed for Firebase 

nach dem decalaration von Klassenvariablen.

+0

aber ich möchte alle Daten in Herausforderungen abfragen. Gibt es eine Möglichkeit, dies zu tun, ohne ein bestimmtes Dokument auszuwählen? – mnlfischer

+0

Bitte sehen Sie meine aktualisierte Antwort. –

+0

auch bearbeiten Kommentar – mnlfischer

Verwandte Themen