RISOLTO Progettazione autenticazione con firebase in Android Studio [Java]

Stato
Discussione chiusa ad ulteriori risposte.

sare1234

Utente Attivo
262
3
Salve sto effettuando un progetto universitario, utilizzando MVP e il pattern Dao con firebase:

Java:
import com.example.natour2022.Dao.Listeners.RetrievalEventListener;
import com.example.natour2022.model.User;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;

public class UserDao extends FirebaseDao<User>  {

    public UserDao() {
        super("User");
    }
 
    @Override
    public void parseDataSnapshot(DataSnapshot dataSnapshot, RetrievalEventListener<User> retrievalEventListener) {
        final User currUser = new User();

        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
        currUser.setId(dataSnapshot.getKey());
        if (dataSnapshot.child("email").getValue() != null) {
            currUser.setNickname(dataSnapshot.child("nickname").getValue().toString());
            currUser.setEmail(dataSnapshot.child("email").getValue().toString());
            currUser.setPassword(dataSnapshot.child("password").getValue().toString());

            retrievalEventListener.OnDataRetrieved(currUser);

        } else {
            FirebaseAuth.getInstance().signOut();
        }


    }

}

Java:
public abstract class FirebaseDao<T> {
    protected static final DatabaseReference dbReference = FirebaseDatabase.getInstance().getReference();

    protected String tableName;

    public FirebaseDao(String tableName)
    {
        this.tableName = tableName;
    }

    protected abstract void parseDataSnapshot(DataSnapshot dataSnapshot, RetrievalEventListener<T> retrievalEventListener);

    public void save(T t, String id, final TaskListener taskListener){
        Task<Void> task = dbReference.child(tableName).child(id).setValue(t);
        task.addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                taskListener.OnSuccess();
            }
        });
        task.addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                taskListener.OnFail();
            }
        });
    }

    public String getNewKey() {
        return dbReference.child(tableName).push().getKey();

    }
}

Java:
public class SingUpPresenter {

    private final SingUpFragment singUpFragment;
    private MainActivity mainActivity;
    private FirebaseAuth auth;
    private DatabaseReference referenceDb;

    private UserDao userDao;
    private User currUser;
    private FirebaseUser user;


    public SingUpPresenter(SingUpFragment singUpFragment) {
        this.singUpFragment = singUpFragment;
    }

    private boolean isValidEmail(String email) {
        return android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
    }

    public static boolean isValidPassword(String password) {
        /*
             ^ : inizio stringa
            (?=[A-Z0-9]*[a-z]) : guarda avanti per assicurarci almeno un carattere minuscolo
            (?=[a-zA-Z]*[0-9]) : guarda avanti per assicurarci almeno un cifra
            (?=[a-z0-9]*[A-Z]) : guarda avanti per assicurarci almeno un carattere maiuscolo
               [a-zA-Z0-9]{8,} : acquisisce otto p più caratteri alfanumerici
                             $ : corrisponde alla fine della stringa
        */
        Pattern PASSWORD_PATTERN
                = Pattern.compile(
                "^(?=[A-Z0-9]*[a-z])(?=[a-zA-Z]*[0-9])(?=[a-z0-9]*[A-Z])[a-zA-Z0-9]{8,}$");

        return PASSWORD_PATTERN.matcher(password).matches();
    }

    public void onButtonSignUpClicked() {
        Resources resources = singUpFragment.getMainActivity().getResources();
        singUpFragment.setEnabledButtonSignUp(false);
        singUpFragment.cleanTextInputErrors();
        String email = singUpFragment.getEmail();
        String password = singUpFragment.getPassword();
        String nickname = singUpFragment.getNickname();
        if (nickname.length() == 0) {
            singUpFragment.setTextInputNicknameError(
                    resources.getString(R.string.fragment_sign_up_enter_nickname)
            );
            singUpFragment.setEnabledButtonSignUp(true);
        } else if (email.length() == 0) {
            singUpFragment.setTextInputEmailError(
                    resources.getString(R.string.fragment_sign_up_enter_email)
            );
            singUpFragment.setEnabledButtonSignUp(true);
        } else if (!isValidEmail(email)) {
            singUpFragment.setTextInputEmailError(
                    resources.getString(R.string.fragment_sign_up_invalid_email)
            );
            singUpFragment.setEnabledButtonSignUp(true);
        } else if (password.length() == 0) {
            singUpFragment.setTextInputPasswordError(
                    resources.getString(R.string.fragment_sign_up_enter_password)
            );
            singUpFragment.setEnabledButtonSignUp(true);
        } else if (!isValidPassword(password)) {
            singUpFragment.setTextInputPasswordError(
                    resources.getString(R.string.fragment_sign_up_enter_password1)
            );
            singUpFragment.setEnabledButtonSignUp(true);
        } else {
            singUpFragment.progressBar.setVisibility(View.VISIBLE);
            UserDao userDao = new UserDao();
            userDao.save(currUser, userDao.getNewKey(), new TaskListener() {
                @Override
                public void OnSuccess() {
                    Toast.makeText(singUpFragment.getActivity(), "SingUp performed successfully", Toast.LENGTH_SHORT).show();
                    openSingInFragment();

                }

                @Override
                public void OnFail() {
                    Toast.makeText(singUpFragment.getActivity(), "SingUp failed. Please try again", Toast.LENGTH_SHORT).show();

                }
            });
        }
    }

    public void openSingInFragment() {
        Fragment fragment = new SingInFragment(mainActivity);
        FragmentManager fragmentManager = singUpFragment.getActivity().getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.activity_sing_in_sing_up, fragment).commit();
    }
}


Java:
public class SingUpFragment extends Fragment {

    private static MainActivity mainActivity;
    private SingUpPresenter signUpPresenter;
    private TextInputLayout email;
    private TextInputLayout password;
    private TextInputLayout nickname;
    private Button buttonSignUp;
    private TextView nomeApp;
    public ProgressBar progressBar;
    private ImageButton buttonBackSingUp;
    private FirebaseUser user;


    public SingUpFragment(MainActivity mainActivity) {
        this.mainActivity = mainActivity;
    }

    public MainActivity getStartActivity() {
        return mainActivity;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(@NotNull LayoutInflater inflater,
                             ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment__sing_up, container, false);
    }

    public void onViewCreated(@NonNull final View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        nomeApp = view.findViewById(R.id.fragment_sing_up_textView_nameApp);
        email = view.findViewById(R.id.fragment_sign_up_text_input_email_layout);
        password = view.findViewById(R.id.fragment_sign_up_text_input_password_layout);
        nickname = view.findViewById(R.id.fragment_sign_up_text_input_nickname_layout);
        buttonSignUp = view.findViewById(R.id.fragment_sign_up_button_sign_up);
        progressBar = view.findViewById(R.id.progressBar_SingUp);
        buttonBackSingUp = view.findViewById(R.id.btBack_singUp);
        user = FirebaseAuth.getInstance().getCurrentUser();
        signUpPresenter = new SingUpPresenter(this);
        initializeUserInterface();
        listenToClickEvents();
    }

    private void openSingInFragment(Fragment fragment) {
        FragmentManager fragmentManager = mainActivity.getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.setCustomAnimations(R.anim.fade_in, R.anim.fade_out);
        fragmentTransaction.add(R.id.fragment_sing_in, fragment).commit();
    }

    private void initializeUserInterface() {
        nomeApp.setAlpha(0.0f);
        nickname.setAlpha(0.0f);
        email.setAlpha(0.0f);
        password.setAlpha(0.0f);
        buttonSignUp.setAlpha(0.0f);
        buttonBackSingUp.setAlpha(0.0f);
        nomeApp.animate().alpha(1.0f).setDuration(1000);
        nickname.animate().alpha(1.0f).setDuration(2000);
        email.animate().alpha(1.0f).setDuration(2500);
        password.animate().alpha(1.0f).setDuration(3000);
        buttonSignUp.animate().alpha(1.0f).setDuration(3500);
        buttonBackSingUp.animate().alpha(1.0f).setDuration(4000);
    }

    public void startClosingTransition() {
        int screenHeight = mainActivity.getScreenHeight();
        email.animate().translationY(screenHeight/100f*66f).setDuration(2500);
        password.animate().translationY(screenHeight/100f*55.5f).setDuration(2250);
        nickname.animate().translationY(screenHeight/100f*45f).setDuration(2000);
        buttonSignUp.animate().translationY(screenHeight/100f*12f).setDuration(1250);
    }


    private void listenToClickEvents() {
        buttonSignUp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                signUpPresenter.onButtonSignUpClicked();
            }
        });
        buttonBackSingUp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), MainActivity.class);
                startActivity(intent);
            }
        });
    }

    public void cleanTextInputErrors() {
        email.setErrorEnabled(false);
        password.setErrorEnabled(false);
        nickname.setErrorEnabled(false);
    }

    public MainActivity getMainActivity() {
        return mainActivity;
    }

    public String getEmail() {
        EditText emailEditText = email.getEditText();
        if(emailEditText == null) return "";
        return emailEditText.getText().toString();
    }

    public String getNickname() {
        EditText nicknameEditText = nickname.getEditText();
        if(nicknameEditText == null) return "";
        return nicknameEditText.getText().toString();
    }

    public String getPassword() {
        EditText passwordEditText = password.getEditText();
        if(passwordEditText == null) return "";
        return passwordEditText.getText().toString();
    }

    public void setEnabledButtonSignUp(boolean enabled) {
        buttonSignUp.setEnabled(enabled);
    }

    public void setTextInputEmailError(String error) {
        email.setErrorEnabled(true);
        email.setError(error);
    }

    public void setTextInputNicknameError(String error) {
        nickname.setErrorEnabled(true);
        nickname.setError(error);
    }

    public void setTextInputPasswordError(String error) {
        password.setErrorEnabled(true);
        password.setError(error);
    }

}

Java:
public class User {

    public String id;
    private String nickname;
    private String email;
    private String password;

  /*  public User(String nickname, String email, String password) {
        this.nickname = nickname;
        this.email = email;
        this.password = password;
    }*/

    public void setId(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }
 
    public String getEmail() {
        return email;
    }

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

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
Il problema è che non mi si crea la tabella "User" nel database di firebase con le informazioni inserite nella GUI, potete aiutarmi a capire il perché?
Grazie infinite :)
 
Ultima modifica:
  • Wow
Reazioni: SysAdmin+

Ibernato

Utente Èlite
4,328
2,047
OS
Windows 10 Pro / Ubuntu 22.04
Salve sto effettuando un progetto universitario, utilizzando MVP e il pattern Dao con firebase:

Java:
import com.example.natour2022.Dao.Listeners.RetrievalEventListener;
import com.example.natour2022.model.User;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;

public class UserDao extends FirebaseDao<User>  {

    public UserDao() {
        super("User");
    }
 
    @Override
    public void parseDataSnapshot(DataSnapshot dataSnapshot, RetrievalEventListener<User> retrievalEventListener) {
        final User currUser = new User();

        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
        currUser.setId(dataSnapshot.getKey());
        if (dataSnapshot.child("email").getValue() != null) {
            currUser.setNickname(dataSnapshot.child("nickname").getValue().toString());
            currUser.setEmail(dataSnapshot.child("email").getValue().toString());
            currUser.setPassword(dataSnapshot.child("password").getValue().toString());

            retrievalEventListener.OnDataRetrieved(currUser);

        } else {
            FirebaseAuth.getInstance().signOut();
        }


    }

}

Java:
public abstract class FirebaseDao<T> {
    protected static final DatabaseReference dbReference = FirebaseDatabase.getInstance().getReference();

    protected String tableName;

    public FirebaseDao(String tableName)
    {
        this.tableName = tableName;
    }

    protected abstract void parseDataSnapshot(DataSnapshot dataSnapshot, RetrievalEventListener<T> retrievalEventListener);

    public void save(T t, String id, final TaskListener taskListener){
        Task<Void> task = dbReference.child(tableName).child(id).setValue(t);
        task.addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                taskListener.OnSuccess();
            }
        });
        task.addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                taskListener.OnFail();
            }
        });
    }

    public String getNewKey() {
        return dbReference.child(tableName).push().getKey();

    }
}

Java:
public class SingUpPresenter {

    private final SingUpFragment singUpFragment;
    private MainActivity mainActivity;
    private FirebaseAuth auth;
    private DatabaseReference referenceDb;

    private UserDao userDao;
    private User currUser;
    private FirebaseUser user;


    public SingUpPresenter(SingUpFragment singUpFragment) {
        this.singUpFragment = singUpFragment;
    }

    private boolean isValidEmail(String email) {
        return android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
    }

    public static boolean isValidPassword(String password) {
        /*
             ^ : inizio stringa
            (?=[A-Z0-9]*[a-z]) : guarda avanti per assicurarci almeno un carattere minuscolo
            (?=[a-zA-Z]*[0-9]) : guarda avanti per assicurarci almeno un cifra
            (?=[a-z0-9]*[A-Z]) : guarda avanti per assicurarci almeno un carattere maiuscolo
               [a-zA-Z0-9]{8,} : acquisisce otto p più caratteri alfanumerici
                             $ : corrisponde alla fine della stringa
        */
        Pattern PASSWORD_PATTERN
                = Pattern.compile(
                "^(?=[A-Z0-9]*[a-z])(?=[a-zA-Z]*[0-9])(?=[a-z0-9]*[A-Z])[a-zA-Z0-9]{8,}$");

        return PASSWORD_PATTERN.matcher(password).matches();
    }

    public void onButtonSignUpClicked() {
        Resources resources = singUpFragment.getMainActivity().getResources();
        singUpFragment.setEnabledButtonSignUp(false);
        singUpFragment.cleanTextInputErrors();
        String email = singUpFragment.getEmail();
        String password = singUpFragment.getPassword();
        String nickname = singUpFragment.getNickname();
        if (nickname.length() == 0) {
            singUpFragment.setTextInputNicknameError(
                    resources.getString(R.string.fragment_sign_up_enter_nickname)
            );
            singUpFragment.setEnabledButtonSignUp(true);
        } else if (email.length() == 0) {
            singUpFragment.setTextInputEmailError(
                    resources.getString(R.string.fragment_sign_up_enter_email)
            );
            singUpFragment.setEnabledButtonSignUp(true);
        } else if (!isValidEmail(email)) {
            singUpFragment.setTextInputEmailError(
                    resources.getString(R.string.fragment_sign_up_invalid_email)
            );
            singUpFragment.setEnabledButtonSignUp(true);
        } else if (password.length() == 0) {
            singUpFragment.setTextInputPasswordError(
                    resources.getString(R.string.fragment_sign_up_enter_password)
            );
            singUpFragment.setEnabledButtonSignUp(true);
        } else if (!isValidPassword(password)) {
            singUpFragment.setTextInputPasswordError(
                    resources.getString(R.string.fragment_sign_up_enter_password1)
            );
            singUpFragment.setEnabledButtonSignUp(true);
        } else {
            singUpFragment.progressBar.setVisibility(View.VISIBLE);
            UserDao userDao = new UserDao();
            userDao.save(currUser, userDao.getNewKey(), new TaskListener() {
                @Override
                public void OnSuccess() {
                    Toast.makeText(singUpFragment.getActivity(), "SingUp performed successfully", Toast.LENGTH_SHORT).show();
                    openSingInFragment();

                }

                @Override
                public void OnFail() {
                    Toast.makeText(singUpFragment.getActivity(), "SingUp failed. Please try again", Toast.LENGTH_SHORT).show();

                }
            });
        }
    }

    public void openSingInFragment() {
        Fragment fragment = new SingInFragment(mainActivity);
        FragmentManager fragmentManager = singUpFragment.getActivity().getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.activity_sing_in_sing_up, fragment).commit();
    }
}


Java:
public class SingUpFragment extends Fragment {

    private static MainActivity mainActivity;
    private SingUpPresenter signUpPresenter;
    private TextInputLayout email;
    private TextInputLayout password;
    private TextInputLayout nickname;
    private Button buttonSignUp;
    private TextView nomeApp;
    public ProgressBar progressBar;
    private ImageButton buttonBackSingUp;
    private FirebaseUser user;


    public SingUpFragment(MainActivity mainActivity) {
        this.mainActivity = mainActivity;
    }

    public MainActivity getStartActivity() {
        return mainActivity;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(@NotNull LayoutInflater inflater,
                             ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment__sing_up, container, false);
    }

    public void onViewCreated(@NonNull final View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        nomeApp = view.findViewById(R.id.fragment_sing_up_textView_nameApp);
        email = view.findViewById(R.id.fragment_sign_up_text_input_email_layout);
        password = view.findViewById(R.id.fragment_sign_up_text_input_password_layout);
        nickname = view.findViewById(R.id.fragment_sign_up_text_input_nickname_layout);
        buttonSignUp = view.findViewById(R.id.fragment_sign_up_button_sign_up);
        progressBar = view.findViewById(R.id.progressBar_SingUp);
        buttonBackSingUp = view.findViewById(R.id.btBack_singUp);
        user = FirebaseAuth.getInstance().getCurrentUser();
        signUpPresenter = new SingUpPresenter(this);
        initializeUserInterface();
        listenToClickEvents();
    }

    private void openSingInFragment(Fragment fragment) {
        FragmentManager fragmentManager = mainActivity.getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.setCustomAnimations(R.anim.fade_in, R.anim.fade_out);
        fragmentTransaction.add(R.id.fragment_sing_in, fragment).commit();
    }

    private void initializeUserInterface() {
        nomeApp.setAlpha(0.0f);
        nickname.setAlpha(0.0f);
        email.setAlpha(0.0f);
        password.setAlpha(0.0f);
        buttonSignUp.setAlpha(0.0f);
        buttonBackSingUp.setAlpha(0.0f);
        nomeApp.animate().alpha(1.0f).setDuration(1000);
        nickname.animate().alpha(1.0f).setDuration(2000);
        email.animate().alpha(1.0f).setDuration(2500);
        password.animate().alpha(1.0f).setDuration(3000);
        buttonSignUp.animate().alpha(1.0f).setDuration(3500);
        buttonBackSingUp.animate().alpha(1.0f).setDuration(4000);
    }

    public void startClosingTransition() {
        int screenHeight = mainActivity.getScreenHeight();
        email.animate().translationY(screenHeight/100f*66f).setDuration(2500);
        password.animate().translationY(screenHeight/100f*55.5f).setDuration(2250);
        nickname.animate().translationY(screenHeight/100f*45f).setDuration(2000);
        buttonSignUp.animate().translationY(screenHeight/100f*12f).setDuration(1250);
    }


    private void listenToClickEvents() {
        buttonSignUp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                signUpPresenter.onButtonSignUpClicked();
            }
        });
        buttonBackSingUp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), MainActivity.class);
                startActivity(intent);
            }
        });
    }

    public void cleanTextInputErrors() {
        email.setErrorEnabled(false);
        password.setErrorEnabled(false);
        nickname.setErrorEnabled(false);
    }

    public MainActivity getMainActivity() {
        return mainActivity;
    }

    public String getEmail() {
        EditText emailEditText = email.getEditText();
        if(emailEditText == null) return "";
        return emailEditText.getText().toString();
    }

    public String getNickname() {
        EditText nicknameEditText = nickname.getEditText();
        if(nicknameEditText == null) return "";
        return nicknameEditText.getText().toString();
    }

    public String getPassword() {
        EditText passwordEditText = password.getEditText();
        if(passwordEditText == null) return "";
        return passwordEditText.getText().toString();
    }

    public void setEnabledButtonSignUp(boolean enabled) {
        buttonSignUp.setEnabled(enabled);
    }

    public void setTextInputEmailError(String error) {
        email.setErrorEnabled(true);
        email.setError(error);
    }

    public void setTextInputNicknameError(String error) {
        nickname.setErrorEnabled(true);
        nickname.setError(error);
    }

    public void setTextInputPasswordError(String error) {
        password.setErrorEnabled(true);
        password.setError(error);
    }

}

Java:
public class User {

    public String id;
    private String nickname;
    private String email;
    private String password;

  /*  public User(String nickname, String email, String password) {
        this.nickname = nickname;
        this.email = email;
        this.password = password;
    }*/

    public void setId(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }
 
    public String getEmail() {
        return email;
    }

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

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
Il problema è che non mi si crea la tabella "User" nel database di firebase con le informazioni inserite nella GUI, potete aiutarmi a capire il perché?
Grazie infinite :)
Da qualche errore? Hai provato con debug a vedere il flusso cosa fa?
Piuttosto che postare una marea di codice, potevi fare un repo github che sicuramente è più chiaro e magari possiamo testarlo :)

Per intenderci, arriva in questo punto?
Codice:
 userDao.save(currUser, userDao.getNewKey(), new TaskListener() {
                @Override
                public void OnSuccess() {
                    Toast.makeText(singUpFragment.getActivity(), "SingUp performed successfully", Toast.LENGTH_SHORT).show();
                    openSingInFragment();

                }

                @Override
                public void OnFail() {
                    Toast.makeText(singUpFragment.getActivity(), "SingUp failed. Please try again", Toast.LENGTH_SHORT).show();

                }
            });


Comunque in un fragment, non ha senso passare l'activity. Piuttosto, utilizzare una interfaccia che implementa l'activity e nell'onAttach ottieni l'interfaccia con il cast del context.

PS: immagino che hai scelto Java perchè l'esame prevede l'uso di Java, ma oramai, il linguaggio ufficiale di Android è Kotlin (alla fine usa sempre una JVM). Tutti gli esempi di google, sono ormai in Kotlin.
 
Ultima modifica:

Ibernato

Utente Èlite
4,328
2,047
OS
Windows 10 Pro / Ubuntu 22.04
Il debugger, questo sconosciuto.
Pensavo non ce ne fosse bisogno, ma a questo punto dovrei proprio decidere a scrivere una guida (usando proprio quel titolo)
Il problema che dovresti fare una guida per ogni IDE. Ma magari possiamo collaborare tutti insieme e ognuno si dedica ad una IDE
 
  • Mi piace
Reazioni: sare1234

sare1234

Utente Attivo
262
3
Da qualche errore? Hai provato con debug a vedere il flusso cosa fa?
Piuttosto che postare una marea di codice, potevi fare un repo github che sicuramente è più chiaro e magari possiamo testarlo :)

Per intenderci, arriva in questo punto?
Codice:
 userDao.save(currUser, userDao.getNewKey(), new TaskListener() {
                @Override
                public void OnSuccess() {
                    Toast.makeText(singUpFragment.getActivity(), "SingUp performed successfully", Toast.LENGTH_SHORT).show();
                    openSingInFragment();

                }

                @Override
                public void OnFail() {
                    Toast.makeText(singUpFragment.getActivity(), "SingUp failed. Please try again", Toast.LENGTH_SHORT).show();

                }
            });


Comunque in un fragment, non ha senso passare l'activity. Piuttosto, utilizzare una interfaccia che implementa l'activity e nell'onAttach ottieni l'interfaccia con il cast del context.

PS: immagino che hai scelto Java perchè l'esame prevede l'uso di Java, ma oramai, il linguaggio ufficiale di Android è Kotlin (alla fine usa sempre una JVM). Tutti gli esempi di google, sono ormai in Kotlin.
ciao, facendo il debugger ho questo:

Schermata 2022-10-31 alle 10.34.46.png


Ho scelto Java si perchè questo è richiesto e non Kootlin
 
Ultima modifica:

sare1234

Utente Attivo
262
3
Bene
Essendo currUser null, fa un set
Codice:
Task<Void> task = dbReference.child(tableName).child(id).setValue(t);
su un oggetto null.
Inizializza currUser e dovrebbe crearti la tabella.
okay dove e a cosa dovrei inizializzalo?....sono a corto di ideee :(
 
Ultima modifica:

Ibernato

Utente Èlite
4,328
2,047
OS
Windows 10 Pro / Ubuntu 22.04
okay dove e a cosa dovrei inizializzalo?....sono a corto di ideee :(
Manca solo l'id, non so dove lo prendi. Visto che hai l'email, potresti usare quella come primary key o generare un id random tramite firebase (immagino sia userDao.getNewKey()),
User currUser = new User(id, emai, password, nickname)
Adatta i parametri con il tuo costruttore

Comuqnue dal debug, non ho capito in che flusso arriva, se in quello citato da me, altrimenti sto parlando a vuoto.
 
  • Mi piace
Reazioni: sare1234

sare1234

Utente Attivo
262
3
Manca solo l'id, non so dove lo prendi. Visto che hai l'email, potresti usare quella come primary key o generare un id random tramite firebase (immagino sia userDao.getNewKey()),
User currUser = new User(id, emai, password, nickname)
Adatta i parametri con il tuo costruttore

Comuqnue dal debug, non ho capito in che flusso arriva, se in quello citato da me, altrimenti sto parlando a vuoto.
No il currUser nullo l'ho quando faccio questo:

Java:
UserDao userDao = new UserDao();
userDao.save(currUser, userDao.getNewKey(), new TaskListener() {
    @Override
    public void OnSuccess() {
        Toast.makeText(singUpFragment.getActivity(), "SingUp performed successfully", Toast.LENGTH_SHORT).show();
        openSingInFragment();

    }

    @Override
    public void OnFail() {
        Toast.makeText(singUpFragment.getActivity(), "SingUp failed. Please try again", Toast.LENGTH_SHORT).show();

    }


comunque il costruttore è questo nella classe utente

Java:
public User(String userId, String nickname, String email, String password) {
     UserId = userId;
     this.nickname = nickname;
     this.email = email;
     this.password = password;
 }

mentre in daoUser ho:

Java:
public void parseDataSnapshot(DataSnapshot dataSnapshot, RetrievalEventListener<User> retrievalEventListener) {
    User currUser = new User(UserId, nickname, email, password);  //ho aggiunto come mi hai detto

    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    currUser.setUserId(dataSnapshot.getKey());
    if (dataSnapshot.child("email").getValue() != null) {
        currUser.setNickname(dataSnapshot.child("nickname").getValue().toString());
        currUser.setEmail(dataSnapshot.child("email").getValue().toString());
        currUser.setPassword(dataSnapshot.child("password").getValue().toString());

        retrievalEventListener.OnDataRetrieved(currUser);

    } else {
        FirebaseAuth.getInstance().signOut();
    }

}
Ma comunque ho lo stesso problema di prima
 
Ultima modifica:

Ibernato

Utente Èlite
4,328
2,047
OS
Windows 10 Pro / Ubuntu 22.04
No il currUser nullo l'ho quando faccio questo:

Java:
UserDao userDao = new UserDao();
userDao.save(currUser, userDao.getNewKey(), new TaskListener() {
    @Override
    public void OnSuccess() {
        Toast.makeText(singUpFragment.getActivity(), "SingUp performed successfully", Toast.LENGTH_SHORT).show();
        openSingInFragment();

    }

    @Override
    public void OnFail() {
        Toast.makeText(singUpFragment.getActivity(), "SingUp failed. Please try again", Toast.LENGTH_SHORT).show();

    }


comunque il costruttore è questo nella classe utente

Java:
public User(String userId, String nickname, String email, String password) {
     UserId = userId;
     this.nickname = nickname;
     this.email = email;
     this.password = password;
 }

mentre in daoUser ho:

Java:
public void parseDataSnapshot(DataSnapshot dataSnapshot, RetrievalEventListener<User> retrievalEventListener) {
    User currUser = new User(UserId, nickname, email, password);  //ho aggiunto come mi hai detto

    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    currUser.setUserId(dataSnapshot.getKey());
    if (dataSnapshot.child("email").getValue() != null) {
        currUser.setNickname(dataSnapshot.child("nickname").getValue().toString());
        currUser.setEmail(dataSnapshot.child("email").getValue().toString());
        currUser.setPassword(dataSnapshot.child("password").getValue().toString());

        retrievalEventListener.OnDataRetrieved(currUser);

    } else {
        FirebaseAuth.getInstance().signOut();
    }

}
Ma comunque ho lo stesso problema di prima
Infatti stai facendo un save di un oggetto nullo. Devi inizializzarlo.
Posta il codice su GitHub con un repo con firebase già configurato in modo da poterlo testare
 
  • Mi piace
Reazioni: sare1234
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!