Firebase 行为异常
Firebase behaves strangely
该视频介绍了输入以下代码后 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 中没有指出任何错误,phone 系统崩溃,必须重新启动。
当您使用 Query#addValueEventListener() 方法时,这意味着您正在侦听 real-time 更新(更改)。也就是说,实时数据库中发生的与您的 referencia
查询相对应的每个更改都将始终触发 onDataChange()
方法。因为当您将回调中的数据添加到您正在收听的查询时,您的 sendToDataBase
会再次写入,因此会出现这种行为。这种情况一次又一次地发生。
要解决这个问题,只需将上面的方法调用更改为Query#addListenerForSingleValueEvent()。这意味着它将监听变化只一次。
该视频介绍了输入以下代码后 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 中没有指出任何错误,phone 系统崩溃,必须重新启动。
当您使用 Query#addValueEventListener() 方法时,这意味着您正在侦听 real-time 更新(更改)。也就是说,实时数据库中发生的与您的 referencia
查询相对应的每个更改都将始终触发 onDataChange()
方法。因为当您将回调中的数据添加到您正在收听的查询时,您的 sendToDataBase
会再次写入,因此会出现这种行为。这种情况一次又一次地发生。
要解决这个问题,只需将上面的方法调用更改为Query#addListenerForSingleValueEvent()。这意味着它将监听变化只一次。