Java 未使用firebase数据库访问调用onChange方法
我在通过Java进行查询和读取firebase数据库时遇到问题。我正在尝试保存登录用户的电子邮件,但似乎从未调用onChangeMethod。 我在firebase中检查了数据库规则和sha1指纹。 代码如下:Java 未使用firebase数据库访问调用onChange方法,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我在通过Java进行查询和读取firebase数据库时遇到问题。我正在尝试保存登录用户的电子邮件,但似乎从未调用onChangeMethod。 我在firebase中检查了数据库规则和sha1指纹。 代码如下: import android.util.Log; import androidx.annotation.NonNull; import com.google.firebase.database.DataSnapshot; import com.google.firebase.data
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());
}
以下是数据库:
我不明白我的问题是由于响应时间,还是由于代码中的某些错误。
谢谢大家! 不要将
Integer.toString(email.hashCode())
作为孩子使用,如果使用firebase身份验证,可以使用将生成随机密钥的push()
方法,或者使用用户uid
如果使用push()
,则首先存储密钥:
String key = reference.child("users").push().getKey();
然后,如果要检索数据,请执行以下操作:
Query existence = reference.child("users").child(key);
existence.addValueEventListener(this);
您是否调试或打印了onDataChange日志中的任何内容?是否触发了
exists()
方法?请同时回复@AlexMamo@Piyush我曾尝试在exists()和onDataChange()上打印相同的内容,但仅在第一个中有效。@AlexMamo创建LockerDatabase对象时,该方法被调用一次。值为“Integer.toString(email.hashCode())”?请将您的数据库结构添加为JSON文件或至少是屏幕截图。
Query existence = reference.child("users").child(key);
existence.addValueEventListener(this);