2017-04-07 6 views
0

Ich möchte überprüfen, ob der Benutzer das Mitglied eines bestimmten Teams ist, wenn der Benutzer nicht gefragt wird, ob er Mitglied ist, dann wird er an a weitergeleitet Seite. Ich habe einige ähnliche Fragen gefunden, aber irgendwie konnte ich immer noch keinen Benutzer zur Datenbank hinzufügen. Unten ist mein Code und dieser Code stürzt ab, wenn ich auf eine der Liste klicke.Firebase - Überprüfen Sie, ob Daten vorhanden sind und fügen Sie sie hinzu

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: [email protected] 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) 

Meine Datenbank:

enter image description here

Wenn Benutzer klicken Sie auf "heng" Team, wird es, wenn der Benutzer E-Mails abrufen in der Datenbank vorhanden sind, wenn isn Es wird dann die E-Mail des Benutzers als teamMember hinzufügen. Ich kann den Benutzer hinzufügen, der das Team erstellt hat, aber ich kann anscheinend keine Benutzer hinzufügen, die später beitreten möchten. Wirklich zu schätzen, wenn mir jemand helfen könnte. Lassen Sie es mich wissen, wenn es an Informationen mangelt.

Antwort

1

Das Problem ist, dass Firebase . (Punkt) -Symbol im Schlüssel nicht akzeptiert. Um eine E-Mail-Adresse zu verwenden, benötigen Sie eine Kodierungsmethode. Die E-Mail Adresse muss [email protected],com (siehe , Komma) anstelle von [email protected] sein, wie es in Ihrem Fall ist. Dies sind die Methoden zum Verschlüsseln und Dekodieren der E-Mail-Adresse.

static String encodeUserEmail(String userEmail) { 
    return userEmail.replace(".", ","); 
} 
static String decodeUserEmail(String userEmail) { 
    return userEmail.replace(",", "."); 
} 

Diese Methode löst Ihr Problem.

+0

Wo sollte ich diese Methoden platzieren? Überall im Code? Tut mir leid, ich weiß nicht, wie man die Methode encode/decode benutzt. – Zephyros

+0

Könnten Sie mir erklären, wie ich diese Codes verwenden soll? – Zephyros

+0

In Ihrer Aktivität, in der Sie sie benötigen oder in einer Hilfsklasse. –

1

Sie Problem ist eindeutig in Ihrem logcat erwähnt: ''

Firebase Datenbank Pfade müssen nicht enthalten, '#', '$', '[', oder ']'

Ich denke, es akzeptiert nicht einmal '@'. Die richtige Methode, um Ihren Benutzer in die Datenbank aufzunehmen, besteht darin, die Benutzer-UID zu verwenden.

ZB:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
String uid = user.getUid(); 

In Ihrem Code, den Sie so etwas tun kann:

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) { 

     } 
    }); 
} 
0

Sie Problem Ihr logcat steht geschrieben: ''

Firebase Datenbank Pfade müssen nicht enthalten , '#', '$', '[' oder ']'

Aber ich sehe auch über Ihren Code. Sie können so eine Firebase-Abfrage schreiben.

databaseMembers = FirebaseDatabase.getInstance().getReference("members"); 
Query q = databaseMembers.orderbyChild("heng").equalTo(user.getEmail()); 

Sie können dynamisch schreiben ich gebe nur ein Beispiel.

Verwandte Themen