Login and Reading/Writing Data in Android Studio, No Error but Not Working

烂漫一生 提交于 2020-01-06 06:08:19

问题


I have run into a problem, where there are no errors, both in the logs and the android monitor.

However when I click login it doesn't work nothing happens at all.

By the way I'm making an app that uses firebase database, and I'm on the Login and Dispalying User Details part.

Perhaps something is wrong with my Login? or in my display? Here's my code:

Login:

package com.loginpack;

import...


public class LoginActivity extends AppCompatActivity {

    //VIEW AND WIDGETS
    Button loginBtn;
    EditText userEmailEdit, userPasswordEdit;

    //STRING FIELDS
    String userEmailString, userPasswordString;

    //FIREBASE AUTH FIELDS
    FirebaseAuth mAuth;
    FirebaseAuth.AuthStateListener nAuthlistener;

    DatabaseReference mDatabaseRef;

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

        //ASSIGN IDS
        loginBtn = (Button) findViewById(R.id.loginBtn);
        userEmailEdit = (EditText) findViewById(R.id.loginEditText);
        userPasswordEdit = (EditText) findViewById(R.id.loginPasswordEditText);

         //ASSIGN INSTANCE

        //Changed here
        mDatabaseRef = FirebaseDatabase.getInstance().getReference().child("Users");
        mAuth = FirebaseAuth.getInstance();

        nAuthlistener = new FirebaseAuth.AuthStateListener(){
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser User = firebaseAuth.getCurrentUser();

                if (User != null){

                    final String emailForVer = User.getEmail();

                    mDatabaseRef.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            checkUserValidation(dataSnapshot,emailForVer);
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                        }
                    });

                }else{

                }
            }
        };

        //ONCLICK LISTENER
        loginBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Perform Login Operation
               userEmailString = userEmailEdit.getText().toString().trim();
               userPasswordString = userPasswordEdit.getText().toString().trim();

                if(!TextUtils.isEmpty(userEmailString) && !TextUtils.isEmpty(userPasswordString) && userPasswordString != null && userEmailString != null)
                {
                    mAuth.signInWithEmailAndPassword(userEmailString, userPasswordString).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            if (task.isSuccessful())
                            {

                                mDatabaseRef.addValueEventListener(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(DataSnapshot dataSnapshot) {
                                            checkUserValidation(dataSnapshot, userEmailString);
                                    }

                                    @Override
                                    public void onCancelled(DatabaseError databaseError) {
                                    }
                                });
                            }else
                            {
                                Toast.makeText(LoginActivity.this, "User Login Failed", Toast.LENGTH_LONG).show();
                                Toast.makeText(LoginActivity.this, task.getException().getMessage(), Toast.LENGTH_LONG).show();
                            }
                        }
                    });
                }
            }
        });
    }
    private void checkUserValidation(DataSnapshot dataSnapshot, String emailForVer) {
        Iterator iterator  = dataSnapshot.getChildren().iterator();

        while(iterator.hasNext())
        {
            DataSnapshot dataUser  = (DataSnapshot) iterator.next();
            if(String.valueOf(dataUser.child("emailUser").getValue()).equals(emailForVer) && dataUser.child("emailUser") != null) {
                if (String.valueOf(dataUser.child("isVerified").getValue()).equals("unverified") && dataUser.child("isVerified") != null) {
                    Intent in = new Intent(LoginActivity.this, Profile.class);
                    in.putExtra("USER_KEY", String.valueOf(dataUser.child("userKey").getValue()));
                    startActivity(in);
                } else {

                    startActivity(new Intent(LoginActivity.this, Welcome.class));
                }
            }
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        mAuth.addAuthStateListener(nAuthlistener);
    }

    @Override
    protected void onStop() {
        super.onStop();
        mAuth.removeAuthStateListener(nAuthlistener);
    }
}

here's where I read the data from my database and diplay it when the user logs in:

public class Welcome extends AppCompatActivity {


    private static final String TAG = "ViewDatabase";
    //ADD FIREBASE STUFF

    //DECLARE FIELDS
    Button outBtn;
    TextView welcome;
    private DatabaseReference myRef;
    private FirebaseDatabase mFirebaseDatabase;
    private String userID;
    private ListView mListView;

    //FIREBASE AUTH FIELDS
    private FirebaseAuth nAuth;
    private FirebaseAuth.AuthStateListener nAuthlistener;


    //GET USER KEY  FROM INTENT

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

        //ASSIGN IDS
        outBtn = (Button) findViewById(R.id.logoutBtn);
        welcome = (TextView) findViewById(R.id.WelcomeName);
        mListView = (ListView) findViewById(R.id.listview);


        //ASSIGN INSTANCE
        myRef = mFirebaseDatabase.getReference().child("Users");
        nAuth = FirebaseAuth.getInstance();
        FirebaseUser User = nAuth.getCurrentUser();
        userID = User.getUid();

        nAuthlistener = new FirebaseAuth.AuthStateListener(){
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser User = firebaseAuth.getCurrentUser();

                if (User != null){
                    Log.d(TAG, "onAuthStateChanged:signed_in:" + User.getUid());
                    Toast.makeText(Welcome.this, "Successfully signed in with: " + User.getEmail(), Toast.LENGTH_LONG).show();

                }else{

                    Log.d(TAG, "onAuthStateChanged:signed_out" + User.getUid());
                    Toast.makeText(Welcome.this, "Successfully signed out.", Toast.LENGTH_LONG).show();
                }
            }
        };
        myRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                showData(dataSnapshot);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });


 /*       myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {


            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });*/

        outBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                nAuth.signOut();
                finish();
                startActivity(new Intent(Welcome.this, MainActivity.class));
            }
        });
    }

    private void showData(DataSnapshot dataSnapshot) {

//Changed here
        for(DataSnapshot ds : dataSnapshot.getChildren()){

            UserInformation uInfo = new UserInformation();

                uInfo.setUserName(ds.child(userID).getValue(UserInformation.class).getUserName());
                uInfo.setUserAge(ds.child(userID).getValue(UserInformation.class).getUserAge());
                uInfo.setUserBirth(ds.child(userID).getValue(UserInformation.class).getUserBirth());
                uInfo.setUserPhone(ds.child(userID).getValue(UserInformation.class).getUserPhone());
                uInfo.setUserUserName(ds.child(userID).getValue(UserInformation.class).getUserUserName());
                uInfo.setUserUserName(ds.child(userID).getValue(UserInformation.class).getUserUserName());
            Log.d(TAG, "showData: snapshot: " + ds);
            Log.d(TAG, "showData: snapshot: " + ds.child("Users"));

            //display all info taken

            Log.d(TAG, "showData: userName: " + uInfo.getUserName());
            Log.d(TAG, "showData: userAge: " + uInfo.getUserAge());
            Log.d(TAG, "showData: userBirth: " + uInfo.getUserBirth());
            Log.d(TAG, "showData: userPhone: " + uInfo.getUserPhone());
            Log.d(TAG, "showData: userUserName: " + uInfo.getUserUserName());

            ArrayList<String> array = new ArrayList<>();
            array.add(uInfo.getUserName());
            array.add(uInfo.getUserAge());
            array.add(uInfo.getUserBirth());
            array.add(uInfo.getUserPhone());
            array.add(uInfo.getUserUserName());
            ArrayAdapter adapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,array);
            mListView.setAdapter(adapter);
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        nAuth.addAuthStateListener(nAuthlistener);
    }

    @Override
    protected void onStop() {
        super.onStop();
        nAuth.removeAuthStateListener(nAuthlistener);
    }
}

Here's what my database looks like:

Is there anything you can suggest that I do? I already tried a lot of stuff. but still notihng happens when I click the login button. Maybe the welcome activity is taking too long to read the data? or perhaps the Login activity is wrong? Any help is appreciated! Thank you!


回答1:


All You Have to do is First Use Auth for Login then Send Current user Id to Your Firebase Database and check if user exists or not.!
Here is sample code hope this might help you.!



      //get User Entered Values from EditText Fields.!
    String email=emailEditText.getText().toString().trim();
    String password=passwordEditText.getText().toString().trim();

     /logging in the user
mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
 @Override
 public void onComplete(@NonNull Task<AuthResult> task) {

  //if the task is successfull
  if(task.isSuccessful()){

  AddEventFireBaseListner(mAuth.getCurrentUser().getUid(),email, password);

  }






private void AddEventFireBaseListner(String uid,String email,String password){

  final User user;
             mdatabaseReference.child("users").orderByKey().equalTo(uid).addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
 public void onDataChange(DataSnapshot dataSnapshot) {

for (DataSnapshot postsnapshot : dataSnapshot.getChildren()) {

  user= postsnapshot.getValue(User.class);



 }//end of comments


    if(user!=null){

 if (user.getemail().equalsIgnoreCase(email) && user.getpassword().equalsIgnoreCase(password)) {

 Intent intent = new Intent(getApplicationContext(), MainActivity.class);

    //Parcalable object 
  intent.putExtra("userObj",user);

  startActivity(intent);


  }



  }
}
  else{
 Snackbar snackbar = Snackbar.make(coordinatorLayout, "Invalid user", Snackbar.LENGTH_LONG).setAction("HIDE", new View.OnClickListener() {
  @Override
   public void onClick(View view) {

    }
  });
   snackbar.show();
  }



  }

  @Override
  public void onCancelled(DatabaseError databaseError) {

   });//End 
    }

and for sending whole `user` object to next activity try to use `Parcelable` 





        public class User implements Parcelable {


        String name;

        String email;

        public User(String name, String email) {
            this.name = name;
            this.email = email;
        }


        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getEmail() {
            return email;
        }

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


        protected User(Parcel in) {
            name = in.readString();
            email = in.readString();
        }

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(name);
            dest.writeString(email);
        }

        @Override
        public int describeContents() {
            return 0;
        }

        public static final Creator<User> CREATOR = new Creator<User>() {
            @Override
            public User createFromParcel(Parcel in) {
                return new User(in);
            }

            @Override
            public User[] newArray(int size) {
                return new User[size];
            }
        };


        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", email='" + email + '\'' +
                    '}';
        }


    }


来源:https://stackoverflow.com/questions/46702189/login-and-reading-writing-data-in-android-studio-no-error-but-not-working

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!