2017-04-14 5 views
1

私はfirebaseデータベースにユーザの一意のIDを格納するアンドロイドアプリを開発中ですので、これを達成するために、 "Users"という名前のルートを作成し、すべてを保存しますこのルート内のユーザーの一意のID。firebaseデータベースのonChildAddedイベントの発生を制御する

一意性をチェックするには、 "Users"の各子を調べなければならず、一意性をチェックした後、 "Users" rootにuniqueIDを追加するか、uniqueIdが利用できないことをユーザーに通知します。 OnChildAddedイベントの

私は一意性をチェックすると、それが発生した後に(私のコードに記載された)いくつかのコードを実行する方法、条件式(/他の場合には)OnChildAddedイベントの発生前に実行します

マイコード

postBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if(!uniqueIdText.getText().toString().trim().equals("")) { 
        uniqueness = true; 
        users.addChildEventListener(new ChildEventListener() { 
         @Override 
         public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
          if (dataSnapshot.getKey().equals(uniqueIdText.getText().toString().trim())) 
           uniqueness = false; 

         } 

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

         } 

         @Override 
         public void onChildRemoved(DataSnapshot dataSnapshot) { 

         } 

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

         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 

         } 

        }); 
       } 
       else if(uniqueIdText.getText().toString().trim().equals("")) 
        Toast.makeText(LoginActivity.this,"Please enter id",Toast.LENGTH_LONG).show(); 

       //======================How to execute it(code below) after occurrence of OnChildAdded event==================== 
        if (uniqueness){ 
         DatabaseReference usersInfo = users.child(uniqueIdText.getText().toString().trim()); 
         startActivity(new Intent(LoginActivity.this, MainActivity.class)); 
        } 
        else{ 
         if(!uniqueIdText.getText().toString().trim().equals("")) 
          Toast.makeText(LoginActivity.this, "ID not available, Please enter a new one", Toast.LENGTH_SHORT).show(); 
        } 


      } 
     }); 

答えて

1

すべてのonChildAddedイベントがいつ呼び出されたかを知る方法はありません。しかし、ValueEventListenerを使用して、データベースからの最初のデータがいつ同期されたかを知ることができます。

しかし、この場合、私はと高く、は別のアプローチをとることをお勧めします。 1つの値が存在するかどうかを確認するためにすべてのUIDをダウンロードすることは、非常に非効率であり、拡張できません。代わりに、探している特定のUIDにリスナーを接続します。その値が存在する場合は、値を取得します。存在しない場合は空のスナップショットを取得します:

users.child(uniqueIdText.getText().toString()).addSingleValueEventListener(@Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     if (dataSnapshot.exists()) { 
      uniqueness = false; 
     } 
     else { 
      uniqueness = true; 
     } 
     ... 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     Log.w(TAG, "onCancelled", databaseError.toException()); 
     // ... 
    } 
}; 
関連する問題