我在通过 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());
}
我正在尝试在 Activity 中显示电子邮件,它显示为默认值而不是正确值:
@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 here
我不明白我的问题是由于响应时间还是代码中的某些错误引起的。 谢谢!
最佳答案
不要将 Integer.toString(email.hashCode())
用作子项,要么使用将生成随 secret 钥的 push()
方法,要么使用用户uid
如果您使用的是 firebase 身份验证。
如果你使用push()
,那么先存储 key :
String key = reference.child("users").push().getKey();
然后当你想检索数据时,执行以下操作:
Query existence = reference.child("users").child(key);
existence.addValueEventListener(this);
关于java - 未使用 firebase 数据库访问调用 onChange 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58911680/