2017-07-30 23 views
0

当用户第一次在应用程序中使用您的Google帐户登录时,我开展了此活动以在数据库中创建用户。它正在工作,但正在数据库中创建多个用户,我不知道为什么。即使存在于你的数据库如何创建用户,如果它不存在?

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

    mAuth = FirebaseAuth.getInstance(); 
    mAuthListener = new FirebaseAuth.AuthStateListener() { 

     @Override 
     public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 

      if (firebaseAuth.getCurrentUser() == null) { 
       goLogInScreen(); 
      } else { 
       final String userGoogleEmail = firebaseAuth.getCurrentUser().getEmail(); 
       databaseUser.orderByChild("userEmail").equalTo(userGoogleEmail).addValueEventListener(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         if (dataSnapshot.exists()) { 
          //User already exists 
         } else { 
          //Can create new user 
          String id = databaseUser.push().getKey(); 
          User user = new User(id, userGoogleEmail, null); 
          databaseUser.child(id).setValue(user); 
         } 
        } 

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

是不是只有当数据库中没有现有用户时才运行,但是当它运行一次时,它会为该用户在数据库中创建多个条目?如果是这样,它会在数据库中创建一个用户多少次? – Geremy

+0

是的,只有在数据库中不存在的情况下,以及运行时(有时候我已经尝试过),在4,2和6次之间变化。 @geremy –

+0

考虑使用共享首选项而不是仅依赖于getCurrentUser()这可能是firebase同步的问题!如果用户登录第一次在SharedPreference中存储一个值。如果用户重新访问该应用程序,则尝试检索SharedPreference。 – Xenolion

回答

1

发生这种情况,因为你正在使用作为标识符由push()方法而不是其他标识符生成的密钥,这实际上是重新创建用户。

我推荐你做什么,就是改变一点保存数据库中数据的逻辑。所以为了解决你的问题,我使用你的密码email address as an identifier来催促你使用,因为它也是独一无二的。你的数据库应该是这样的:

Firebase-database 
    | 
    --- Users 
      | 
      --- [email protected],com 
      |  | 
      |  --- //data 
      | 
      --- [email protected],com 
       | 
       --- //data 

正如你可能看到的,我一直在使用,(逗号),而不是.(点)保存在数据库火力地堡的电子邮件addreees。

[email protected] - >名@电子邮件,COM

这是因为火力地堡不允许在关键的名称,比如.符号。因此,要存储这样的值,编码的电子邮件是必需的。要做到这一点,我recomand您使用以下方法:

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

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

要验证用户是否存在,简单地把一个listeenr的Users节点和dataSnapshot对象像这样上使用exists()方法:

DatabaseReference usersRef = usersDatabaseReference.child(userEmail); 
ValueEventListener valueEventListener = new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     if (!dataSnapshot.exists()) { 
      //create user 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) {} 
}; 
usersRef.addListenerForSingleValueEvent(valueEventListener); 

希望这可以解决您的问题。

相关问题