Проблема чтения данных из базы данных Firebase Realtime в Android Kotlin - PullRequest
0 голосов
/ 16 апреля 2020

В настоящее время я работаю в учебных целях с Kotlin в Android, и у меня возникают проблемы, когда я пытаюсь получить доступ к данным, находящимся в настоящее время в базе данных Firebase. Вот данные в базе данных:

Образ базы данных

После того, как я только что создал основное действие со всеми необходимыми импортами после связывания приложения с Firebase, но, к сожалению, любой Когда я запускаю приложение и нажимаю кнопку, ничего не происходит.

private lateinit var userReference : DatabaseReference
lateinit var textView : TextView
lateinit var button : Button


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    textView = findViewById(R.id.test)
    button = findViewById(R.id.test2)
    button.setOnClickListener(object : View.OnClickListener{
        override fun onClick(v: View?) {
            userReference = FirebaseDatabase.getInstance().getReference("Users")
            Log.d("IPP", "Im here now...")

            userReference.addValueEventListener(object : ValueEventListener {
                override fun onCancelled(p0: DatabaseError) {
                    Log.d("ipp", p0.message)
                }

                override fun onDataChange(p0: DataSnapshot) {
                    Log.d("Ipp", "Im in the onDataChange")
                    for (childDataSnapshot in p0.children) {
                        Log.d("Ipp",childDataSnapshot.key) }
                }

            })
        }

    })
}

Журнал не появляется ни разу, и это действительно раздражает, поскольку я ищу в документации и, насколько я знаю, это все, что я должен сделать (я также проверил правила в базе данных, и чтение / запись всегда верно).

РЕДАКТИРОВАТЬ: я забыл упомянуть, единственный журнал, который появляется, когда он выполняется, " Я здесь сейчас ... ", тот, что после нажатия на кнопку, которая работает.

РЕДАКТИРОВАТЬ 2: Правила в базе данных установлены, чтобы позволить чтение / запись всем сейчас только для целей тестирования. Правила в базе данных

Ответы [ 3 ]

0 голосов
/ 16 апреля 2020

Что-то не так с логикой c, вы получаете один и тот же экземпляр каждый раз, когда нажимаете кнопку, перемещаете инициализацию DatabaseReference за пределы кнопки, а также своих слушателей, потому что они слушают внутри кнопки

  userReference = FirebaseDatabase.getInstance().getReference("Users")
 button.setOnClickListener(object : View.OnClickListener{
        override fun onClick(v: View?) {

            Log.d("IPP", "Im here now...")


        }

    })

userReference.addValueEventListener(object : ValueEventListener {
                override fun onCancelled(p0: DatabaseError) {
                    Log.d("ipp", p0.message)
                }

                override fun onDataChange(p0: DataSnapshot) {
                    Log.d("Ipp", "Im in the onDataChange")
                    for (childDataSnapshot in p0.children) {
                        Log.d("Ipp",childDataSnapshot.key) }
                }

            })

Теперь, каждый раз, когда вы добавляете значение в ссылку «Пользователи», сработает ваш addValueEventListener, вы можете проверить значение этого параметра внутри пользователя с помощью нажатия кнопки

0 голосов
/ 17 апреля 2020
private lateinit var userReference : DatabaseReference
lateinit var textView : TextView
lateinit var button : Button


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    textView = findViewById(R.id.test)
    button = findViewById(R.id.test2)
    button.setOnClickListener(object : View.OnClickListener{
        override fun onClick(v: View?) {
            userReference = FirebaseDatabase.getInstance().getReference("Users").getReference("0") <-------- add this
            Log.d("IPP", "Im here now...")

            userReference.addValueEventListener(object : ValueEventListener {
                override fun onCancelled(p0: DatabaseError) {
                    Log.d("ipp", p0.message)
                }

                override fun onDataChange(p0: DataSnapshot) {
                    Log.d("Ipp", "Im in the onDataChange")
                    for (childDataSnapshot in p0.children) {
                        Log.d("Ipp",childDataSnapshot.key) }
                }

            })
        }

    })
}

добавить .getReference ("0")

0 голосов
/ 16 апреля 2020

enter image description here

@ peter-haddad Питер прав, но я объясню, если вам это нужно или кто-то найдет такое решение один раз в день, это правило по умолчанию для базы данных firebase делает его ложным, чтобы предотвратить доступ неавторизованного пользователя к вашей базе данных, поэтому измените его на true для true и для чтения, и для правого, но когда вы работаете над релизной версией, пожалуйста, сделайте его ложным и войдите или зарегистрируйтесь для пользователя

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