0

When running my code I get a NullPointerException, because my Firestore documents won't download into my object. I'm unsure as to why but I've looked around at what formating the object getters and setters are supposed to have and I thought I did it right, but the error message still says there's no getters or setters for the fields in the database

SubjectGroupPage.java

db.collection("messagesIT")
                /*.orderBy("TimeSent", Query.Direction.DESCENDING)*/
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {

                            ArrayList<MessageObj> messages = new ArrayList<>();
                            for (QueryDocumentSnapshot document : task.getResult()) {
                                MessageObj mess = document.toObject(MessageObj.class);
                                messages.add(mess);
                                Log.d(TAG, "" + mess);
                                showToast("b");
                            }

                            //reading and displaying messages
                            for (int i = 0; i < messages.size(); i++) {
                                showToast("d");
                                TableLayout tl = findViewById(R.id.TableLayoutSubjectGroupPage);
                                TableRow trMessage = new TableRow(SubjectGroupPage.this);
                                TableRow trSender = new TableRow(SubjectGroupPage.this);
                                TextView txtSender = new TextView(SubjectGroupPage.this);
                                TextView txtMessage = new TextView(SubjectGroupPage.this);
                                txtMessage.setText(messages.get(i).getMessage());
                                txtSender.setText(messages.get(i).getSender());
                                txtMessage.setTextSize(20);
                                txtMessage.setTextColor(0);
                                txtMessage.setWidth(0);
                                if (messages.get(i).getSender().equals(currentUser.getUid())) {
                                    txtMessage.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
                                    txtSender.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
                                } else {
                                    txtMessage.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
                                    txtSender.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
                                }
                                LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(0, TableRow.LayoutParams.MATCH_PARENT, 1);
                                txtMessage.setLayoutParams(param);

                                //creating message display
                                trSender.addView(txtSender);
                                trMessage.addView(txtMessage);
                                tl.addView(txtSender);
                                tl.addView(trMessage);
                            }


                        } else {
                            Log.d(TAG, "Error getting documents: ", task.getException());
                        }
                    }
                }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {

                showToast("There has been an error, please try again later.");
                Log.d(TAG, "Error: " + e);

            }
        });

LogChat

W/Firestore: (0.6.6-dev) [CustomClassMapper]: No setter/field for Sender found on class oxley.it.collectivelearning.MessageObj
W/Firestore: (0.6.6-dev) [CustomClassMapper]: No setter/field for Timesent found on class oxley.it.collectivelearning.MessageObj (fields/setters are case sensitive!)
(0.6.6-dev) [CustomClassMapper]: No setter/field for Message found on class oxley.it.collectivelearning.MessageObj
D/SubjectGroupPage.java: oxley.it.collectivelearning.MessageObj@e82129e
W/Firestore: (0.6.6-dev) [CustomClassMapper]: No setter/field for Sender found on class oxley.it.collectivelearning.MessageObj
W/Firestore: (0.6.6-dev) [CustomClassMapper]: No setter/field for TimeSent found on class oxley.it.collectivelearning.MessageObj (fields/setters are case sensitive!)
W/Firestore: (0.6.6-dev) [CustomClassMapper]: No setter/field for Timesent found on class oxley.it.collectivelearning.MessageObj (fields/setters are case sensitive!)
W/Firestore: (0.6.6-dev) [CustomClassMapper]: No setter/field for Message found on class oxley.it.collectivelearning.MessageObj
D/SubjectGroupPage.java: oxley.it.collectivelearning.MessageObj@743769b
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: oxley.it.collectivelearning, PID: 23895
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean 
java.lang.String.equals(java.lang.Object)' on a null object reference
    at 
oxley.it.collectivelearning.SubjectGroupPage$retrieveMessages$2
.onComplete(SubjectGroupPage.java:154)
    at com.google.android.gms.tasks.zzj.run(Unknown Source:4)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:187)
    at android.app.ActivityThread.main(ActivityThread.java:7025)
    at java.lang.reflect.Method.invoke(Native Method)
    at 
com.android.internal.os.RuntimeInit$MethodAndArgsCaller
.run(RuntimeInit.java:514)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:888)

MessageObj.java

public class MessageObj {

private String message;
private String sender;
private Timestamp timesent;

public MessageObj() {}

public void setMessage(String message, String sender, Timestamp timesent) {
    this.message = message;
}
@Exclude
public String getMessage() {
    return message;
}

public void setSender(String sender) {
    this.sender = sender;
}
@Exclude
public String getSender() {
    return sender;
}

public void setTimesent(Timestamp timesent) {
    this.timesent = timesent;
}

public Timestamp getTimesent() {
    return timesent;
}
}

When running properly, I want the ArrayList to hold all the documents and to be able to use the object getters and setters on the ArrayList.

my database

ANSWER:

It works by just parsing it into the object like this;

for (QueryDocumentSnapshot document : task.getResult()) {
    String message = document.getString("Message");
    String sender = document.getString("Sender");
    String timesent= document.getString("Timesent");

    MessageObj mess = new MessageObj (message, sender, timesent);
    messages.add(mess);
    Log.d(TAG, "" + mess);
    showToast("b");
}
S.Wilko
  • 11
  • 6

1 Answers1

1

You are getting those errors because you are using @Exclude annotation in front of the getters. Beside that, the setMessage() method should only have one argument. A correct way of structuring your MessageObj class is:

public class MessageObj {
    private String message;
    private String sender;
    private Timestamp timesent;

    public MessageObj() {}

    public MessageObj(String message, String sender, Timestamp timesent) {
        this.message = message;
        this.sender = sender;
        this.timesent = timesent;
    }

    public String getMessage() { return message; }

    public String getSender() { return sender; }

    public Timestamp getTimesent() { return timesent; }
}

Or even simpler, using public fields:

public class MessageObj {
    public String message;
    public String sender;
    public Timestamp timesent;

    public MessageObj() {}

    public MessageObj(String message, String sender, Timestamp timesent) {
        this.message = message;
        this.sender = sender;
        this.timesent = timesent;
    }
}
Alex Mamo
  • 130,605
  • 17
  • 163
  • 193
  • Unfortunately, I'm still getting the same error. I've added my database if that shows any problems. Any other ideas? – S.Wilko Aug 08 '19 at 07:40
  • You are getting the same error because of **[this](https://stackoverflow.com/questions/53924189/how-to-read-firestore-sub-collection-and-pass-it-to-firestorerecycleroptions/53943559#53943559)**. Does it work if you are using my solution from that post regarding capital letters vs. lower case letters? – Alex Mamo Aug 08 '19 at 08:55