user16493824
user16493824

Reputation: 57

Error while performing compound queries in firestore

I want to perform a compound query in firestore where I would like to get all documents with field bloodgroup equal to A+ and with field createdBy not equal to email. This email is that of the logged in user. When I perform the query I get NullPointerException. How to perform the query correctly 021-07-24 19:50:24.746 17550-17550/com.example.bloodbankcompany E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.bloodbankcompany, PID: 17550 java.lang.NullPointerExceptionatcom.example.bloodbankcompany.UserlistActivity$EventChangeListener3$1.onEvent(UserlistActivity.kt:217) I am storing the document snapshot inside the userArrayList array. Without the whereNotEqualTo query I am getting output where my documents get listed in recyclerview.

private fun EventChangeListener2(){

        val sharedPreferences1 = getSharedPreferences("email", Context.MODE_PRIVATE)
        val email: String? = sharedPreferences1.getString("email","null")?.trim()

        Toast.makeText(this, "ssrae$email", Toast.LENGTH_SHORT ).show()

        mFireStore.collection("applicationForm").whereNotEqualTo("createdBy",email).whereEqualTo("bloodgroup","A+").addSnapshotListener(object : EventListener<QuerySnapshot>{
            override fun onEvent(value: QuerySnapshot?, error: FirebaseFirestoreException?) {
                if (error!= null){
                    Log.e("firestore error", error.message.toString())
                }

                for(dc: DocumentChange in value?.documentChanges!!){
                    if (dc.type== DocumentChange.Type.ADDED){


                        userArrayList.add(dc.document.toObject(User1::class.java))
                        var number=userArrayList
                        var number1 =userArrayList

                    }
//                    Toast.makeText(applicationContext,userArrayList.toString(), Toast.LENGTH_SHORT).show()

                }
                myAdapter.notifyDataSetChanged()
            }

        })

    }

Upvotes: 1

Views: 666

Answers (1)

Dr. Sa.M.
Dr. Sa.M.

Reputation: 2513

Well, I have edited a little bit of your code, if it still doesn't work add a comment.

Also, an explanation about changes is commented below.

private fun EventChangeListener2() {

        val sharedPreferences1 = getSharedPreferences("email", Context.MODE_PRIVATE)
        val email: String? = sharedPreferences1.getString("email", "null")?.trim()

        Log.d("firestore email", email.toString())

        Toast.makeText(this, "ssrae$email", Toast.LENGTH_SHORT).show()

        // try and catch will avoid your app to crash.
        try {

            //ref
            var ref = mFireStore.collection("applicationForm")
                .whereEqualTo("bloodgroup", "A+")


            /**
             *  I believe since your email is of type nullable and there may be
             *  maybe a chance that email is null and is given to whereNotEqualTo
             *  I am just making an assumption here since I don't know what you
             *  recieve from sharedPreferences and whether it is null or not
             *
             *  So, what I have done here is,
             *  firstly, I have split the firestore call into 2 parts and
             *  Secondly, I have a null-check for email, if it is
             *  not-null ref will also include this query
             *
             */
            //null Check for email
            if (email != null) ref = ref.whereNotEqualTo("createdBy", email)

            // Snapshot Listener
            ref.addSnapshotListener(object : EventListener<QuerySnapshot> {
                override fun onEvent(value: QuerySnapshot?, error: FirebaseFirestoreException?) {
                    if (error != null) {
                        Log.e("firestore error", error.message.toString())
                    }

                    for (dc: DocumentChange in value?.documentChanges!!) {
                        if (dc.type == DocumentChange.Type.ADDED) {


                            userArrayList.add(dc.document.toObject(User1::class.java))
                            var number = userArrayList
                            var number1 = userArrayList

                        }
//                    Toast.makeText(applicationContext,userArrayList.toString(), Toast.LENGTH_SHORT).show()

                    }
                    myAdapter.notifyDataSetChanged()
                }

            })
        } catch (e: Exception) {
            Log.e("firestore error", "Error", e)
        }
    }

EDIT: According to firebase docs,

https://firebase.google.com/docs/firestore/query-data/indexing#exemptions

If you attempt a compound query with a range clause that doesn't map to an existing index, you receive an error. The error message includes a direct link to create the missing index in the Firebase console.

Upvotes: 1

Related Questions