我想检查用户是否是特定团队的成员,如果用户不会被要求加入,如果他是,那么他将被定向到一个页面。我确实找到了一些类似的问题,但不知怎的,我仍然无法将用户添加到数据库中。下面是我的代码,每当我点击其中一个列表时,此代码就会崩溃。
databaseMembers = FirebaseDatabase.getInstance().getReference("members");
listViewTeams.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
//getting the selected team
Team team = teams.get(i);
checkMember();
//creating an intent
Intent intent = new Intent(getApplicationContext(), ChatRoomActivity.class);
//putting team name and id to intent
intent.putExtra(TEAM_ID, team.getTeamId());
intent.putExtra(TEAM_NAME, team.getTeamName());
//starting the activity with intent
startActivity(intent);
}
});
private void checkMember(){
FirebaseUser user = firebaseAuth.getCurrentUser();
final String teamMember = user.getEmail();
databaseMembers.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.hasChild(teamMember)){
finish();
}
else{
databaseMembers.push().setValue(teamMember);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
logcat的:
04-07 12:44:41.167 19091-19091/com.example.user.stfv2 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.user.stfv2, PID: 19091
com.google.firebase.database.DatabaseException: Invalid Firebase Database path: haha@gmail.com. Firebase Database paths must not contain '.', '#', '$', '[', or ']'
at com.google.android.gms.internal.zzbtf.zzjl(Unknown Source)
at com.google.firebase.database.DataSnapshot.hasChild(Unknown Source)
at com.example.user.stfv2.MainActivity$8.onDataChange(MainActivity.java:352)
at com.google.firebase.database.Query$1.onDataChange(Unknown Source)
at com.google.android.gms.internal.zzbpx.zza(Unknown Source)
at com.google.android.gms.internal.zzbqx.zzZS(Unknown Source)
at com.google.android.gms.internal.zzbra$1.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
我的数据库:
当用户点击&#34; heng&#34;团队,它将检查用户的电子邮件是否存在于数据库中,如果不是,那么它将以用户的身份添加用户的电子邮件。我可以添加创建团队的用户,但我似乎无法添加想要稍后加入的用户。真的很感激,如果有人能帮助我。如果缺少信息,请告诉我。
答案 0 :(得分:1)
问题是Firebase不接受密钥中的.
(点)符号。因此,要使用电子邮件地址,您需要使用编码方法。电子邮件地址必须是name@mail,com
(请参阅,
逗号),而不是您的情况下的nume@email.com。这些是编码和解码电子邮件地址的方法。
static String encodeUserEmail(String userEmail) {
return userEmail.replace(".", ",");
}
static String decodeUserEmail(String userEmail) {
return userEmail.replace(",", ".");
}
这种方法可以解决您的问题。
答案 1 :(得分:0)
你的logcat中明确提到了你的问题:
Firebase数据库路径不得包含&#39;。&#39;,&#39;#&#39;,&#39; $&#39;,&#39; [&#39;,或者&#39;]&#39;
我认为它甚至不接受@&#39;。将用户添加到数据库的正确方法是使用用户uid。
例如:
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String uid = user.getUid();
在您的代码中,您可以执行以下操作:
private void checkMember(){
FirebaseUser user = firebaseAuth.getCurrentUser();
final String teamMember = user.getUid();
databaseMembers.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.hasChild(teamMember)){
finish();
}
else{
databaseMembers.push().setValue(teamMember);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
答案 2 :(得分:0)
你的问题是写你的logcat:
Firebase数据库路径不得包含&#39;。&#39;,&#39;#&#39;,&#39; $&#39;,&#39; [&#39;,或者&#39;]&#39;
但我也查看你的代码。您可以像这样编写firebase查询。
databaseMembers = FirebaseDatabase.getInstance().getReference("members");
Query q = databaseMembers.orderbyChild("heng").equalTo(user.getEmail());
你可以写动态我只是举个例子。