java - onChange 方法未通过 firebase 数据库访问调用
问题描述
我在通过 Java 进行查询和读取我的 firebase 数据库时遇到问题。我正在尝试保存已登录用户的电子邮件,但似乎从未调用过 onChangeMethod。我已经在 firebase 中检查了数据库规则和 sha1 指纹。这是代码:
import android.util.Log;
import androidx.annotation.NonNull;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
public class LockerDatabase implements ValueEventListener{
private FirebaseDatabase database;
private DatabaseReference reference;
private User currUser;
private ArrayList<Password> passwords;
public int count;
public LockerDatabase(String email, String name) {
database = FirebaseDatabase.getInstance();
reference = database.getReference();
currUser = new User();
passwords = new ArrayList<>();
if (!exists(email))
createUser(email, name);
else
loadPasswords();
}
private void loadPasswords() {
//TODO: read from db all passwords
}
public String getEmail(){
return currUser.getEmail();
}
private void createUser(String email, String name) {
currUser.setEmail(email);
currUser.setName(name);
currUser.setHashId(Integer.toString(email.hashCode()));
//TODO: add user to database
}
private boolean exists(String email) {
Query existence = reference.child("users").child(Integer.toString(email.hashCode()));
existence.addValueEventListener(this);
if (currUser == null)
return false;
else
return true;
}
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
currUser.setEmail((String)dataSnapshot.child("email").getValue());
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.w("CAN", "user_cancelled", databaseError.toException());
}
我正在尝试在活动中显示电子邮件,它显示为默认值而不是正确的:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.locker_layout);
Intent intent = getIntent();
userEmail = intent.getStringExtra("email");
userName = intent.getStringExtra("name");
db = new LockerDatabase(userEmail, userName);
TextView t = findViewById(R.id.textView);
t.setText(db.getEmail());
//TODO: display db results
//TODO: if the user is new, set an access key
}
这是数据库:这里是 JSON
我不明白我的问题是由于响应时间还是代码中的一些错误。谢谢!
解决方案
不要Integer.toString(email.hashCode())
小时候使用,要么使用push()
生成随机密钥的方法,要么使用用户uid
,如果您使用的是 firebase 身份验证。
如果您使用push()
,则首先存储密钥:
String key = reference.child("users").push().getKey();
然后,当您要检索数据时,请执行以下操作:
Query existence = reference.child("users").child(key);
existence.addValueEventListener(this);
推荐阅读
- batch-file - 如果一个变量被设置为一个变量的名称,那么它可以成为那个变量吗?(批)
- database - 多模块访问同一张表的架构解决方案
- android - 我无法在 Android 中获取图像视图的轴心点
- websocket - 将大量数据推送到浏览器的简单服务器?
- rust - 让 serde 只为人类可读的序列化程序生成十六进制字符串?
- python - 如何对数据集的文件名进行排序,我使用 glob.glob('path/*.png')
- android - Flutter Web Sockets 未连接到 Laravel
- javascript - 为什么连视口都没有达到阈值时,会执行 Intersection Observer API 的回调?
- android - 如何为底部导航设置点击目标
- python - 我可以使用 Keras LSTM 进行一列的时间序列预测吗?