【问题标题】:Validate username and email crashed and cannot insert to firebase database验证用户名和电子邮件崩溃,无法插入到 Firebase 数据库
【发布时间】:2018-02-13 10:42:57
【问题描述】:

当这行代码对应用程序产生错误时,应用程序无法将任何数据插入数据库。

ref.child(uid).orderByChild("username").equalTo(validateName).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if(dataSnapshot.exists()){
                    Toast.makeText(Register.this, "Username Taken. Please try another one", LENGTH_SHORT).show();
                    return;
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

此外,uid 是从电子邮件身份验证部分收集电子邮件的代码。

private FirebaseAuth auth = FirebaseAuth.getInstance();
private FirebaseUser ur = auth.getCurrentUser();
db = FirebaseDatabase.getInstance();
    ref = db.getReference();
    if (ur != null){
        uid = ur.getEmail();
    }

来自 logcat 的错误

FATAL EXCEPTION: main
                                                                   Process: com.example.rex.ota30, PID: 30205
                                                                   com.google.firebase.database.DatabaseException: Invalid Firebase Database path: rexyou0831@gmail.com. Firebase Database paths must not contain '.', '#', '$', '[', or ']'
                                                                       at com.google.android.gms.internal.zzbqh.zzjm(Unknown Source)
                                                                       at com.google.android.gms.internal.zzbqh.zzjn(Unknown Source)
                                                                       at com.google.firebase.database.DatabaseReference.child(Unknown Source)
                                                                       at com.example.rex.ota30.Register$4.onComplete(Register.java:203)
                                                                       at com.google.android.gms.tasks.zzc$1.run(Unknown Source)
                                                                       at android.os.Handler.handleCallback(Handler.java:751)
                                                                       at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                       at android.os.Looper.loop(Looper.java:154)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

【问题讨论】:

    标签: android firebase firebase-realtime-database firebase-authentication


    【解决方案1】:

    正如你的错误所说,Firebase Database paths must not contain '.', '#', '$', '[', or ']'。这意味着 Firebase 不允许您在键符号中使用这些符号。因此,您需要像这样对电子邮件地址进行编码:

    name@email.com -> name@email,com

    为此,我建议您使用以下方法:

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

    【讨论】:

    • 当您将电子邮件地址添加到数据库时,您需要先对其进行编码。您的电子邮件地址应如下所示:name@email,com。这是 Firebase 中的常见做法。
    • 不工作。我确实输入了代码 encodeUserEmail(email) 但仍然无法替换。
    • 如果您的数据库中有其他错误记录,您需要删除它们并添加新的正确数据。它必须有效。
    • 看我的回答。我插入3个地方也无法替换。
    • 您需要在添加到类 User 的对象之前对电子邮件进行编码。使用 ->encodeUserEmail(em); 然后使用 User u = new User (un, pw, ag, em, gd, pn, ad, pc, ps);
    【解决方案2】:

    现在我的代码将是这样的,那么在哪里将其更改为存在?

    ref.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
    
                        for(DataSnapshot c : dataSnapshot.getChildren()){
    
                            String vun = c.child("username").getValue().toString();
    
                            if (vun.equalsIgnoreCase(usnm)){
    
                                Toast.makeText(Register.this, "Username Taken. Please try another one.", LENGTH_SHORT).show();
                                return;
    
                            }
                        }//end of for loop
                    }
    
                    @Override
                    public void onCancelled(DatabaseError databaseError) {
    
    
                    }
                });// end of addvalue
    

    【讨论】:

      猜你喜欢
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 2019-07-05
      • 1970-01-01
      • 2017-02-23
      相关资源
      最近更新 更多