contexte strong>: dans ma base de données de Firebase, j'ai un parent appelé "clients" qui stocke des données dans "vendeur" ou "mangeur" en fonction duquel le client est enregistré comme. problème : STRUT> "Vendor" enregistré peut se connecter en tant que "mangeur" et "mangeur" peut se connecter comme "vendeur". Avec Code actuel, l'application permet toujours à «Vendor» de se connecter à l'écran «Mangeur» et inversement. P> Ce que j'ai besoin de faire: strong> n'autorise que "le fournisseur" de connecter l'écran du fournisseur et "mangeur" dans l'écran du mangeur. p> Erreurs strides: strong> Je reçois ce crash lorsqu'un mangeur ou un fournisseur de connexion à l'écran de mangeur sur le vide p> @overridePublic Void OndataChange P> "java.lang.nullpointereException: tentative d'invoquer la méthode virtuelle 'booléenne java.lang.object.equals (java.lang.object)' sur une référence objet nulle à com.example.zzyzj.eloteroman.login.eatcornloginactivité $ 4.Dontatachange " em> p>
4 Réponses :
Vous pouvez utiliser SharedPreferences.SO Vous pouvez enregistrer un ID utilisateur avec la valeur du type d'utilisateur enregistré et vérifier la connexion si l'ID utilisateur correspond à votre valeur, il peut se connecter si vous le souhaitez.
if(sc.equals("Vendor"))
{
//Put Your Code Here
}
Cela semble prometteur. Je me demande, existe-t-il un moyen d'obtenir le nom de l'enfant que l'UID est stockée et transmettait cela comme référence pour vérifier si l'utilisateur UID correspond à l'enfant que l'UID est stockée? Je pense à cela afin d'empêcher les bugs à l'avenir si un utilisateur désinstalle l'application ou l'installe sur un nouveau téléphone.
Vous devez d'abord demander à l'utilisateur, que ce soit que l'utilisateur souhaite vous inscrire en tant que fournisseur ou mangeur. Une fois que
L'utilisateur s'est inscrit, puis enregistrez son type dans la base de données Firebase. P>
blockQuote> Recommande_utilisateur: pour la connexion: strong> p> Vous devez avoir deux boutons pour différencier la connexion E-G Connect en tant que vendeur ou
Connectez-vous comme mangeur. E-G Si l'utilisateur cliquez sur Connexion comme fournisseur puis transmettez-le
Tapez à travers l'intention de vous connecter activiy. p>
blockQquote> une fois l'utilisateur authentifié, vérifiez ensuite son type p> getintent (). getstringextra ("user_type"), donnera au type que vous
passé de stratcreen.C'est donc si votre utilisateur_type existe alors vous
passera à une activité suivante autrement montrer une erreur toast p>
blockquote> ps: strong> p> Si vous voulez que vous souhaitez utiliser SharePreferences, il est facile de faire mais un
problème peut survenir si l'utilisateur CLEAR Cache ou la désinstallation puis réinstallez la
application L'application ne serait pas en mesure de trouver le
Fichier SharePreferences. SharePreferences stocke des données dans le fichier local. P>
blockQuote> p>
+ user_key: (Firebaseauth.getinstance (). GetCurrentUser (). Getuid ());
+ user_type: fournisseur / mangeur (sous Noeud_key node) p>
blockquote>
Bonne mise en page pour l'aide. Je vais sans utiliser de Pref partagé à cause de vos conseils. J'ai mis à jour mon poste et je suis presque terminé mais je rencontre toujours une erreur et un accident.
Je pense qu'un bon moyen de résoudre ce problème augmenterait un nouveau champ dans votre base de données Firebase pour chaque utilisateur indiquant s'il s'agit d'un fournisseur ou d'un mangeur. Ce champ peut être rempli lors de la création d'un compte. Ensuite, lorsque quelqu'un veut vous connecter, vous devez d'abord vérifier s'il s'agit d'un fournisseur qui tente de vous connecter à l'écran du fournisseur ou à l'écran de mangeur et inversement. De cette façon, vous saurez certainement le type de l'utilisateur. Pouvez-vous faire cela avec votre implémentation ou je manque quelque chose?
Exemple fonction: p>
Veuillez envisager de poster cette réponse comme un commentaire ou essayez d'ajouter du code dans la réponse.
Cela semble vraiment propre. J'aime ça. Je stockerais alors l'intention de connecter l'utilisateur dans l'instruction si (DataSnapshot.getvalue (). Equals ("Vendor")) correct?
Découvrez mon poste mis à jour, j'ai utilisé une partie de ce code mais j'ai toujours une erreur de crash. Presque là
Je pense que le pointeur NULL est parce que vous n'avez pas de valeur de mangeur dans la base de données. Firebasedatabase.getinstance (). GetReference (). enfant ("clients"). Enfant (Firebaseauth.GetInstance (). GetCurrentatuser (). Getuid ()). enfant ("mangeur"). addlistenerforsinglevalueEvent (nouveau valuantEveillanceListener () {retournera la valeur du mangeur. Je suggère d'ajouter du champ de catégorie au lieu de mangeur en Firebase et dans ce champ Ajouter un mangeur en tant que chaîne si l'utilisateur est un mangeur et un fournisseur si l'utilisateur est Vendeur, de cette façon, vous distinguerez les utilisateurs et être capable de comparer avec des anneaux. ().
Vous pouvez faire la même chose avec Boolean, par exemple True - Mangeur, False - Vendeur, mais vous devrez modifier la partie Datasnapshot.getvalue (). Equals ("Vendeur") partie à Datasnapshot.getvalue () == vrai, ou juste datasnapshot.getvalue ().
Merci pour les réponses. La chose étrange est que j'ai une valeur de mangeur dans la base de données. C'est comme ça que je crée l'utilisateur lors de son inscription en tant que mangeur: string client_id = firebaseauth.getcurrentUser (). GetUID (); DatabaseReferenceReference client_db = Firebasedatabase.getinstance (). GetReference (). Enfant ("Clients") .child ("mangeur"). Ch Iild (client_id); client_db.setvalue (vrai);
Ow, vous devriez peut-être envisager de changer la base de données, car avec cette approche, il sera très difficile de trouver quel utilisateur est un mangeur ou un vendeur.
Je ferais certitude que je envisagerais de changer la base de données. Donc, à ce moment-là, la façon dont c'est, cela crée un enfant client, puis s'ils s'inscrivent comme un fournisseur, il met ces données dans un enfant de fournisseur au sein des clients. Idem pour le mangeur. Ce n'est pas la meilleure façon de le faire?
Pour la flexibilité dont vous avez besoin, je créerais des clients enfants et à l'intérieur, je créerais des utilisateurs avec 3 paramètres: email, nom, booléen (fournisseur ou client). Vous pouvez plus tard ajouter plus si nécessaire.
Vous devez d'abord vous connecter et obtenir l'ID utilisateur, puis utiliser cela pour interroger la référence du mangeur, puis si cet utilisateur existe à l'écran du mangeur d'autre d'aller à l'écran du fournisseur
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
circProgressBar.setVisibility(View.VISIBLE);
final String emailUser = emailEditText.getText().toString();
final String passwordUser = passwordEditText.getText().toString();
firebaseAuth.signInWithEmailAndPassword(emailUser, passwordUser)
.addOnCompleteListener(EatCornLoginActivity.this, new
OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
Log.d(TAG, "createUserWithEmail:success");
FirebaseUser user = mAuth.getCurrentUser();
DatabaseReference client_db =
FirebaseDatabase.getInstance().getReference().child("Clients")
.child("Eater")
.child(user.getUid());
client_db.addListenerForSingleValueEvent(new ValueEventListener()
{
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (snapshot.exists()) {
// go to eater activity
}else{
//go to vendor activity
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
Toast.makeText(getContext(), firebaseError.getMessage(),
Toast.LENGTH_SHORT).show();
}
});
} else {
// If sign in fails, display a message to the user.
Log.w(TAG, "createUserWithEmail:failure",
task.getException());
Toast.makeText(EmailPasswordActivity.this, "Authentication
failed.", Toast.LENGTH_SHORT).show();
}
// ...
}
});
Cela a l'air vraiment bon et facile à utiliser. Ce que je pense que je pouvais faire, c'est si (instantané.exists ()) pour le fournisseur et qu'ils essaient de se connecter avec l'écran du fournisseur, cela fonctionnera et les logera, sinon il aura une erreur. Je vais essayer ça.
J'ai utilisé ce code et obtenez une erreur, j'ai mis à jour le message d'origine
Votre nouveau code s'écrasera si cet utilisateur n'a aucune valeur dans sa section Modifier. Donc, vous devriez d'abord faire un chèque si l'instantané est null
Je ne comprends pas ce que tu veux?
Ce B> pourrait vous aider.
Mis à jour le code et la mise en page de la question
Lorsque vous dites, le fournisseur peut se connecter sous forme de mangeur et de mangeur peut se connecter en tant que fournisseur, est-ce qu'il y a un commutateur sur l'écran de connexion de l'utilisateur pour sélectionner le flux ou vous affichez le flux approprié en fonction des informations d'identification?
DataSnapshot.getvalue () Code> est NULL et à cause d'une exception NULL Pointer est lancée. Donc, vérifiez que les nulls avant de le comacher avec mangeurLorsque l'utilisateur ouvre l'application, ils sont donnés aux options du bouton; un pour être un vendeur et un autre pour être un mangeur. S'ils cliquent sur le fournisseur, ils se rendent à l'écran d'enregistrement / login du fournisseur. Ensuite, lorsqu'ils se connectent, ils sont envoyés à l'activité Vendormaps. Même chose pour le mangeur sauf qu'ils sont envoyés à l'activité des cartes du mangeur.
Alors quelque chose comme
if (datasnapshot.getvalue () == null) {datasnapshot.getvalue (). Equals ("mangeur") code>?Petit changement, quelque chose comme
if (datasnapshot.getvalue ()! = Null) {datasnapshot.getvalue (). Equals ("mangeur") code>J'ai hâte d'essayer cela, je dois dormir maintenant, je vous tiendrai au courant, merci!