0

I am trying to login verification using firebase realtime database in android studio. However unfortunately I cannot because some error is hindering me:

    com.google.firebase.database.DatabaseException: Invalid Firebase Database path: samar32@gmail.com. 
    Firebase Database paths must not contain '.', '#', '$', '[', or ']'
    at com.google.firebase.database.core.utilities.Validation.validatePathString(Validation.java:45)
    at com.google.firebase.database.DatabaseReference.child(DatabaseReference.java:102)
    at com.google.firebase.database.DataSnapshot.child(DataSnapshot.java:65)
    at com.example.etechnomateapp.loginActivity$2.onDataChange(loginActivity.java:155)

Activity_login page:

<?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="@drawable/screenbg"
 tools:context=".loginActivity">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="10sp"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/img"
        android:layout_width="250dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="20sp"
        android:src="@drawable/shop_logo"
        tools:ignore="ContentDescription"
        />

    <TextView

        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="40sp"
        android:layout_marginBottom="40sp"
        android:gravity="center_horizontal"
        android:text="@string/user_login"
        android:textAlignment="center"
        android:textAllCaps="true"
        android:textColor="@color/colorDarkRed"
        android:textSize="22sp"

        />

    <com.google.android.material.textfield.TextInputLayout
        android:id="@+id/userEmailWreapper"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColorHint="@color/colorRed"
        android:layout_marginTop="5dp"
        >
        <EditText
            android:id="@+id/emailAddress"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:layout_marginTop="5dp"
            android:inputType="textEmailAddress"
            android:hint="@string/enter_email"
            android:textColor="@color/colorRed"
            android:textSize="18sp"/>

    </com.google.android.material.textfield.TextInputLayout>

    <com.google.android.material.textfield.TextInputLayout
        android:id="@+id/userPasswordWreapper"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColorHint="@color/colorRed"
        android:layout_marginTop="5dp"
        >
        <EditText
            android:id="@+id/password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:layout_marginTop="5dp"
            android:hint="@string/enter_password"
            android:textColor="@color/colorRed"
            android:inputType="textPassword"
            android:textSize="18sp"/>
    </com.google.android.material.textfield.TextInputLayout>

    <Button
        android:id="@+id/btnLogin"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20sp"
        android:text="@string/user_login"
        android:background="@drawable/btnloginbg"
        android:textColor="@color/colorWhite"
        android:textSize="20sp"
        />

    <TextView

        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10sp"
        android:layout_marginBottom="10sp"
        android:gravity="center_horizontal"
        android:text="Or"
        android:textAlignment="center"
        android:textAllCaps="true"
        android:textColor="@color/colorDarkRed"
        android:textSize="22sp"

        />


    <TextView
        android:id="@+id/forgetPassword"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="@string/forgetPass"
        android:textAlignment="center"
        android:textAllCaps="false"
        android:layout_marginLeft="45dp"
        android:textColor="@color/colorDarkRed"
        android:textSize="16sp"

        />

    <TextView
        android:id="@+id/UserSignup"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="@string/signup"
        android:textAlignment="center"
        android:textAllCaps="false"
        android:layout_marginLeft="250dp"
        android:layout_marginTop="-20dp"
        android:textColor="@color/colorDarkRed"
        android:textSize="16sp"
        android:clickable="true"

        />
   </LinearLayout>

</RelativeLayout>

login_Activity.Java page:

  package com.example.etechnomateapp;

 import androidx.annotation.NonNull;
 import androidx.appcompat.app.AlertDialog;
 import androidx.appcompat.app.AppCompatActivity;

 import android.content.Intent;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.TextView;
 import android.widget.Toast;

 import com.google.android.gms.tasks.OnCompleteListener;
 import com.google.android.gms.tasks.Task;
 import com.google.android.material.textfield.TextInputLayout;
 import com.google.firebase.auth.AuthResult;
 import com.google.firebase.auth.FirebaseAuth;
 import com.google.firebase.database.DataSnapshot;
 import com.google.firebase.database.DatabaseError;
 import com.google.firebase.database.DatabaseReference;
 import com.google.firebase.database.FirebaseDatabase;
 import com.google.firebase.database.ValueEventListener;

public class loginActivity extends AppCompatActivity implements View.OnClickListener {
TextInputLayout emailWrapper, passwordWrapper;
EditText userEmail, userPassword;
Button loginBtn;

private AlertDialog loadingBar;

private final String parentDbName = "Users";

private TextView register;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    emailWrapper= findViewById(R.id.userEmailWreapper);
   passwordWrapper= findViewById(R.id.userPasswordWreapper);

    userEmail= findViewById(R.id.emailAddress);
    userPassword=findViewById(R.id.password);

     loginBtn=(Button) findViewById(R.id.btnLogin);

     AlertDialog.Builder builder= new AlertDialog.Builder(this);
     builder.setCancelable(false);
     builder.setView(R.layout.activity_layout_loading_dialog);

     loadingBar= builder.create();

     loginBtn.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             loginUser();
         }
     });




    register= (TextView) findViewById(R.id.UserSignup);

    register.setOnClickListener(this);
}

private  void loginUser(){
    String email=  userEmail.getText().toString().trim();
    String password= userPassword.getText().toString().trim();

    if(email.isEmpty()){

                 emailWrapper.setError("Email Required");
                 emailWrapper.requestFocus();
                 return;
             }

            else if(password.isEmpty()){
                 passwordWrapper.setError("Password Required");
                 passwordWrapper.requestFocus();
                 return;
             }
            else {
                loadingBar.setTitle("Your Login Account");
                loadingBar.setMessage("Please wait Until the finish proceeds");
                loadingBar.setCanceledOnTouchOutside(false);
                loadingBar.show();

                allowAccessToAccount(email, password);
    }

}

private void  allowAccessToAccount(final String email, final String password){

    final DatabaseReference rootRef;
    rootRef= FirebaseDatabase.getInstance().getReference();

    rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {

            if(snapshot.child(parentDbName).child(email).exists()){

                LoginUser userData= 
        snapshot.child(parentDbName).child(email).getValue(LoginUser.class); /*error occur here*/

                if(userData.getEmail().equals(email)){
                    Toast.makeText(loginActivity.this,"Logged In Successfully.", Toast.LENGTH_SHORT).show();
                    loadingBar.dismiss();
                   // Intent intent = new Intent(loginActivity.this, ShopActivity.class);
                    //startActivity(intent);
                }
                else{
                    loadingBar.dismiss();
                    Toast.makeText(loginActivity.this, "Register Failed.",
                            Toast.LENGTH_LONG).show();
                }



            }


            else {
                Toast.makeText(loginActivity.this,"Account with this "+email+" do not exist.", 
                Toast.LENGTH_SHORT).show();
                loadingBar.dismiss();
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {

        }
    });
}

@Override
public void onClick(View v) {
    switch (v.getId()){
        case R.id.UserSignup:
            startActivity(new Intent( this, RegistrationActivity.class));
            break;         
     }
 }

LoginUser.java page:

   package com.example.etechnomateapp;

public class LoginUser {
private String firstName,  lastName, password, email, contact;

public LoginUser() {
}

public LoginUser(String firstName, String lastName, String password, String email, String contact) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.password = password;
    this.email = email;
    this.contact = contact;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getContact() {
    return contact;
}

public void setContact(String contact) {
    this.contact = contact;
}
 }

Database:

RealTime DB image

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
  • Going forward please only use the `android-studio` tag for questions about the Android Studio IDE itself. For questions about Android programming in general, use the `android` tag. – Frank van Puffelen Dec 15 '20 at 15:54
  • Also, you should never, ever, EVER store passwords in plain text. If your database gets breached, every single user is instantly compromised. Additionally, because people in general are, well, dumb and reuse passwords, you also risk compromising people on several platforms at once. See: https://stackoverflow.com/q/1054022 – Zoe Dec 15 '20 at 15:56

1 Answers1

1

It's because you have provided the email as child where, special character not allowed in firebase realtime database

LoginUser userData = snapshot.child(parentDbName).getValue(LoginUser.class);
Ashish
  • 6,791
  • 3
  • 26
  • 48
  • 1
    Good catch Ashish. The common workaround is to filter the `.` (or any other disallowed character) from the email address before using it as a key in the database. – Frank van Puffelen Dec 15 '20 at 15:56