2017-07-30 11 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

DBに既存のユーザーがいない場合にのみ実行されますが、一度実行されると、そのユーザーの複数のエントリがDBに作成されますか?もしそうなら、DBにユーザーを何回作成するのですか? – Geremy

+0

はい、データベースに既存のものがなく、実行されたときに、試したことがある場合もありますが、4,2,6回の間で異なります。 @geremy –

+0

getCurrentUser()のみに頼るのではなく、共有環境設定の使用を検討してください。firebaseのsyncの問題かもしれません!最初のユーザーのユーザーログインがSharedPreferenceに値を格納している場合。また、ユーザーがアプリケーションに再度訪問する場合は、SharedPreferenceを取得しようとします。 – Xenolion

答えて

1

あなたが識別子としてpush()方法により生成されたキーを使用していない別の識別子と、これは実際にあなたのデータベースに存在していても、再びユーザーを作成されているので、これが起こっています。

あなたにお勧めするのは、データベースのデータを保存するロジックを少し変更することです。あなたの問題を解決するために、私はあなたがその鍵ではなく、email address as an identifierの代わりに使っていることをあなたに勧めます。 .(ドット)

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

あなたはおそらく見ての通り、私は,(カンマ)を使用して、Firebaseデータベース内のメールaddreeesを保存していない:あなたのデータベースには、次のようになります。

[email protected] - >名@電子メール、COM

Firebaseがキー名に.のような記号を許可していないためです。このような値を格納するには、エンコードされた電子メールが必要です。ユーザーが存在する場合は、単純にUsersノード上listeenrを入れて、このようなdataSnapshotオブジェクトにexists()メソッドを使用し、確認するために

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

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

:これを達成するために、私はあなたが、次の方法を使用してrecomand

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); 

これがあなたの問題を解決することを願っています。

関連する問題