1

Firebaseについて学び、Firebase認証とFirebaseデータベースをユーザーのシステムに実装しようとしています。 FacebookでFirebase認証を使用する方法はわかっていますが、各ユーザーにいくつかの属性を追加したいと考えています(Firebase認証では、電子メール、UID、プロバイダ、およびプロファイルのイメージURLのみがあります)。Firebaseデータベースに特定のキーが存在するかどうかをチェック

私のソリューションは、ユーザー・レジストリーを作成しました:。 Database image

問題だから私はちょうどプッシュは初回のみでユーザーのサインを作るされて何をしたいのか

をこれは、私の主な活動:

public class MainActivity extends AppCompatActivity { 

DatabaseReference myRef1; 
DatabaseReference myRef; 
private int RC_SIGN_IN = 1; 
private String urlI, uid, name, uide; 
boolean check_rate; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    myRef1 = FirebaseDatabase.getInstance().getReference(); 
    myRef = myRef1.child("Usuarios"); 
    FirebaseAuth auth = FirebaseAuth.getInstance(); 
    id(); 

    if (auth.getCurrentUser() != null) { 
     uide = auth.getInstance().getCurrentUser().getUid().toString(); 

     if (check_rate) { 
      startActivity(new Intent(this, HomeActivity.class)); 
      finish(); 

     } else { 
      Map mProfile = new HashMap(); 
      mProfile.put("name", auth.getInstance().getCurrentUser().getDisplayName().toString()); 
      mProfile.put("image", auth.getInstance().getCurrentUser().getPhotoUrl().toString()); 
      mProfile.put("uid", auth.getInstance().getCurrentUser().getUid().toString()); 


      myRef.push().setValue(mProfile); 
      startActivity(new Intent(this, HomeActivity.class)); 
      finish(); 
     } 
    } else { 

     // abre a tela de login 
     startActivityForResult(
       AuthUI.getInstance() 
         .createSignInIntentBuilder() 
         .setIsSmartLockEnabled(false) 
         .setProviders(
           AuthUI.FACEBOOK_PROVIDER) 
         .build(), 
       RC_SIGN_IN); 

    } 
} 

private void id() { 
     myRef.addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       Map data = (Map) dataSnapshot.getValue(); 
       //profile 
       urlI = (String) (data.get("image")); 
       name = (String) (data.get("name")); 
       uid = (String) (data.get("uid")); 
       check_rate = data.containsKey(uide); 
      } 

      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
       Map data = (Map) dataSnapshot.getValue(); 
       //profile 
       //Map mData = (HashMap) data.get("profile"); 
       urlI = (String) (data.get("image")); 
       name = (String) (data.get("name")); 
       uid = (String) (data.get("uid")); 
       check_rate = data.containsKey(uide); 
      } 

      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) { 

      } 

      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 

     }); 
    } 

これは動作しません。ユーザーがログインするたびにアップロードします。

答えて

0

アイテムのリストを保存しようとしている場合は、それらのアイテムをナチュラルキーの下に保存することが最善の方法です。

ナチュラルキーがuidのユーザーの場合。このデータ構造により

Map mProfile = new HashMap(); 
mProfile.put("name", auth.getInstance().getCurrentUser().getDisplayName().toString()); 
mProfile.put("image", auth.getInstance().getCurrentUser().getPhotoUrl().toString()); 

myRef.child(auth.getInstance().getCurrentUser().getUid().toString()) 
    .setValue(mProfile); 

同じユーザーをもう一度書く場合、それだけで同じに書き込むことになります:あなたは自分のUIDでユーザーを格納する場合は、直接ユーザーを格納する場所を決定することができます場所を再度。したがって、データの重複は起こりません。

+0

これは素晴らしいフランク作品です。どうもありがとうございます –

関連する問題