【问题标题】:Firebase behaves strangelyFirebase 行为异常
【发布时间】:2022-01-22 17:07:32
【问题描述】:

本视频介绍了在输入以下代码后 Firebase 发生的情况。直到视频的第二个5,一切正常。 当我从第 6 秒开始单击按钮时,Firebase 出现此视频问题:

https://www.youtube.com/watch?v=rQlTZyCWcmM

代码:

        button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final String raça = spinner_raca.getSelectedItem().toString();
                final String regiaoDoEstado = spinner_regiaoDoEstado.getSelectedItem().toString();
                final String estado = spinner_estado.getSelectedItem().toString();
                String identificador2 = identificadorCampo2.getText().toString();
                String identificadorEmHash = criptografarEmMD5(identificador2);

                Intent intentRecebedora = getIntent();
                Bundle bundleRecebedor = intentRecebedora.getExtras();
                String nomecompleto = bundleRecebedor.getString("nomecompleto");
                String email = bundleRecebedor.getString("email");
                String doencasPreExistentes = bundleRecebedor.getString("doencasPreExistentes");
                String dataDeNascimento = bundleRecebedor.getString("dataDeNascimento");
                String genero = bundleRecebedor.getString("genero");
                String identificadorEmHash = bundleRecebedor.getString("identificadorEmHash");
                String telefone = intentRecebedora.getStringExtra("telefone");

                referencia = FirebaseDatabase.getInstance().getReference().child("Usuarios").child(identificadorEmHash);
                Toast.makeText(getApplicationContext(), identificadorEmHash, Toast.LENGTH_LONG).show();
                if(identificadorEmHash.equals(null)) {
                    Toast.makeText(getApplicationContext(), "Identifier does not exist", Toast.LENGTH_LONG).show();
                } else {
                    referencia.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onCancelled(@NonNull DatabaseError error) {

                        }
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                            referencia = FirebaseDatabase.getInstance().getReference().child("Usuarios").child(identificadorEmHash);
                            if (!dataSnapshot.exists()) {
                                Toast.makeText(getApplicationContext(), "O identificador digitado não existe.", Toast.LENGTH_LONG).show();
                            } else {
                                HashMap<String, String> sendToDataBase = new HashMap<>();
                                    sendToDataBase.put("Nome Completo", nomecompleto);
                                    sendToDataBase.put("E-mail", email);
                                    sendToDataBase.put("Identificador em Hash", identificadorEmHash);
                                    sendToDataBase.put("Telefone", telefone);
                                    sendToDataBase.put("Doenças Pré Existentes", doencasPreExistentes);
                                    sendToDataBase.put("Data de Nascimento", dataDeNascimento);
                                    sendToDataBase.put("Gênero", genero);
                                    sendToDataBase.put("Região do Estado em que mora", regiaoDoEstado);
                                    sendToDataBase.put("Raça", raça);
                                    sendToDataBase.put("Estado do Brasil em que mora", estado);

                                try {
                                    raiz.child(identificadorEmHash).setValue(sendToDataBase);

                                } catch (Exception e) {
                                    e.getMessage();
                                }

                            }
                           
                        }
                    });
                }
            }
        });

请问,如何解决这个问题? Firebase 中是否有我们可以看到错误的位置? Android Studio中没有指出错误,手机系统崩溃,必须重新启动。

【问题讨论】:

    标签: java android firebase firebase-realtime-database google-cloud-platform


    【解决方案1】:

    当您使用Query#addValueEventListener() 方法时,这意味着您正在侦听实时更新(更改)。话虽如此,实时数据库中发生的与您的referencia 查询相对应的每次更改都将始终触发onDataChange() 方法。因为当您在回调中添加数据到您正在收听的查询时,您的 sendToDataBase 会再次被写入,因此会出现这种行为。这种情况一遍又一遍地发生。

    要解决这个问题,只需将上述方法调用更改为Query#addListenerForSingleValueEvent()。这意味着它将侦听一次更改。

    【讨论】:

    • 完美!非常感谢,亚历克斯。解决了。画面不是很好,但至少说明了问题。
    猜你喜欢
    • 2019-01-16
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 2017-01-22
    相关资源
    最近更新 更多