Как проверить существующие данные в Firebase? - PullRequest
0 голосов
/ 02 мая 2018

enter image description here

выше - мое дерево узлов Firebase. вот мой код:

private fun attemptAdd(){
    var focus: View? = null
    var cancel: Boolean = false
    var prefix: String  = prePrefView.text.toString() + prefText.text.toString()
    var sp: SimPrefix

    //checks for the length of the input
    if(prefText.length()<2){
        prefText.error = "invalid length"
        cancel = true
        focus = prefText
    }

    mDatabaseReference.child("simnumbers")
            .orderByChild("simPref")
            .equalTo(prefix)
            .addListenerForSingleValueEvent(object : ValueEventListener{
                override fun onDataChange(dataSnapshot: DataSnapshot) {
                    dataSnapshot.children.forEach {
                        sp = it.getValue(SimPrefix::class.java)!!
                        if(sp.simCard.equals(prefix)){ //checks if there is already a node with the same data
                            prefText.error = "already exists"
                            cancel = true
                            focus = prefText
                        }
                    }
                }

                override fun onCancelled(p0: DatabaseError?) {

                }
            })

    if(cancel){
        focus?.requestFocus()
    }
    else{ //if all is valid, proceed to the next method.
        addPrefix()
    }
}

То, что я предполагаю здесь, - то, что это, кажется, не вводит слушателя, так как это всегда переходит к следующему способу, позволяющему пользователю вводить те же существующие данные.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Попробуйте следующее, чтобы проверить, существуют ли данные:

  mDatabaseReference.child("simnumbers")
        .orderByChild("simPref")
        .equalTo(prefix)
        .addListenerForSingleValueEvent(object : ValueEventListener{
            override fun onDataChange(dataSnapshot: DataSnapshot) {
                    if(dataSnapshot.exists()){
                dataSnapshot.children.forEach {
                    sp = it.getValue(SimPrefix::class.java)!!
                       }
                    }
                }
            }

            override fun onCancelled(p0: DatabaseError?) {

            }
        })

datasnapshot имеет значение simnumbers, затем он проверит, существует ли этот моментальный снимок в базе данных и соответствует ли дочерний элемент simPref указанному значению

public boolean exists ()

Возвращает true, если снимок содержит ненулевое значение.

подробнее здесь:

https://firebase.google.com/docs/reference/android/com/google/firebase/database/DataSnapshot.html#exists()

0 голосов
/ 02 мая 2018

Я предоставляю Java-код, который вы можете изменить на kotlin, а также поместите ваше условие в метод onDatachange.

     Query query1=reference.child(reference.getKey()).child("simnumbers").orderByChild("simPref").equalTo(prefix);
    query1.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // here place your condition
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...