Firebase - 检查数据是否存在并添加它们

时间:2017-04-07 13:19:57

标签: android firebase firebase-realtime-database

我想检查用户是否是特定团队的成员,如果用户不会被要求加入,如果他是,那么他将被定向到一个页面。我确实找到了一些类似的问题,但不知怎的,我仍然无法将用户添加到数据库中。下面是我的代码,每当我点击其中一个列表时,此代码就会崩溃。

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)

我的数据库:

enter image description here

当用户点击&#34; heng&#34;团队,它将检查用户的电子邮件是否存在于数据库中,如果不是,那么它将以用户的身份添加用户的电子邮件。我可以添加创建团队的用户,但我似乎无法添加想要稍后加入的用户。真的很感激,如果有人能帮助我。如果缺少信息,请告诉我。

3 个答案:

答案 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());

你可以写动态我只是举个例子。