Java 检查firebase实时数据库中是否已存在用户
我获取快照以检查数据库中是否存在唯一值,但快照始终为null。解决方案如下:Java 检查firebase实时数据库中是否已存在用户,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我获取快照以检查数据库中是否存在唯一值,但快照始终为null。解决方案如下: DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); DatabaseReference userNameRef = rootRef.child("Users").child("Nick123"); ValueEventListener eventListener = new ValueEventListener() { @
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference userNameRef = rootRef.child("Users").child("Nick123");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(!dataSnapshot.exists()) {
//create new user
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
userNameRef.addListenerForSingleValueEvent(eventListener);
我的数据库如下所示:
users
(auto-generated push token ID)
fullname
username
gender
...
users
userId
fullname: Nick123
我不知道这是否是正确的方法,但我使用push()方法将用户对象添加到数据库中,该方法生成了如上所述的推令牌ID
因此,为了不创建重复用户,我应该对上述解决方案做哪些更改?有没有更好的方法?也许想用一些firebase身份验证方法检查firebase uid
更新
我的数据库截图:
正如您所看到的,“users”下面的字符串与用户的uid不同 如果您有此数据库:
users
(auto-generated push token ID)
fullname
username
gender
然后,要检查用户是否存在,您需要执行以下操作:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference userNameRef = rootRef.child("users");
Query queries=userNameRef.orderByChild("fullname").equalTo("Nick123");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(!dataSnapshot.exists()) {
//create new user
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
queries.addListenerForSingleValueEvent(eventListener);
首先,如果您有用户
小写字母,然后在子项中添加用户
,那么您需要使用查询来检查全名是否等于Nick123
数据库的结构通常如下所示:
users
(auto-generated push token ID)
fullname
username
gender
...
users
userId
fullname: Nick123
属性是key:value
,key是标识符,Nick123是值,因此在child()
方法中,您需要写入标识符fullname
,而不是Nick123
然后,由于您可以获取用户ID,因此可以执行以下操作:
FirebaseUser currentFirebaseUser =FirebaseAuth.getInstance().getCurrentUser();
String userId=currentFirebaseUser.getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference userNameRef = rootRef.child("users").child(uid).child("fullname");
userNameRef.addValueEventListener(new ValueEventListener(){...}
在将用户详细信息保存到数据库中时,这不是最佳做法。首先,您应该实现,然后为了检查数据库中是否存在用户,您应该使用以下代码行:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("users").child(uid);
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(!dataSnapshot.exists()) {
//create new user
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
uidRef.addListenerForSingleValueEvent(eventListener);
因此,解决这个问题的关键是调用
child()
方法,并将uid
作为参数传递,而不是调用生成随机唯一标识符的push()
方法。由于没有名为Nick123child(“Nick123”)的子级,因此会得到null代码>正如我在回答的第二部分所解释的。由于您使用的是randomid而不是userid,请检查我答案的第一部分。我已经实现了firebase身份验证,但我需要存储一些额外的用户信息。因此,我将用户详细信息保存到数据库中。因此,使用您的解决方案,快照仍然为空。我添加了我数据库的屏幕截图是null
,并且它始终为null
,因为您使用的是唯一的ITE,用于输入推送id,而不是我在回答中建议您的Firebase身份验证提供的id,对吗?而且孩子是用户
而不是用户
。参见大写字母U
vs小写字母U
?@AndréKool好的。刚刚更新了我的答案,添加了这些信息以便更好地理解。谢谢安德烈!