2017-11-26 13 views
0

firebaseにデータを実装する際に問題が発生しましたが、複製されてしまい、fab.setOnClickListenerをクリックしてデータベースにメッセージを追加する際に問題があります。Firebaseでメッセージを1対1に複製するチャットアプリケーション

そして、私はFirebaseにメッセージを追加するとき、私の注文と関係があります(私は注文のためにmessageCountを使います)。ここにfirebase Databaseのコードと画像があります。

コード:データベースの

private static final int SIGN_IN_REQUEST_CODE = 111; 
private FirebaseListAdapter<ChatMessage> adapter; 
private ListView listView; 
private int messagesCount = 0; 
private DatabaseReference myRef; 

private User mUser; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_chat); 
    myRef = FirebaseDatabase.getInstance().getReference(); 

    //find views by Ids 
    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    final EditText input = (EditText) findViewById(R.id.input); 
    listView = (ListView) findViewById(R.id.list); 

    try { 
     mUser = getUserFromBundle(); 
    }catch (NullPointerException e){ 
     Log.e(TAG, "NullPointerException: " + e.getMessage()); 
     Toast.makeText(this, "Something went wrong", Toast.LENGTH_SHORT).show(); 
     getSupportFragmentManager().popBackStack(); 
    } 

    if (FirebaseAuth.getInstance().getCurrentUser() == null) { 
     // Start sign in/sign up activity 
     startActivityForResult(AuthUI.getInstance() 
       .createSignInIntentBuilder() 
       .build(), SIGN_IN_REQUEST_CODE); 
    } else { 
     // User is already signed in, show list of messages 
     getMessagesCount(); 
     showAllOldMessages(); 
    } 

    Log.d(TAG, "onCreate: USER SELECT TO CHAT WITH********************** " + mUser.getUser_id()); 

    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      //messagesCount = 0; 
      getMessagesCount(); 
      if (input.getText().toString().trim().equals("")) { 
       Toast.makeText(ChatActivity.this, "Please enter some texts!", Toast.LENGTH_SHORT).show(); 
      } else { 
       Log.d(TAG, "onDataChange: Messages -- BEFORE 2 *******************************" + messagesCount); 
       //messagesCount = 0; 

       myRef.child(getString(R.string.dbname_messages)) 
         .child(FirebaseAuth.getInstance().getCurrentUser().getUid()) 
         .child(mUser.getUser_id()) 
         .child(String.valueOf(messagesCount + 1)) 
         .setValue(new ChatMessage(input.getText().toString(), 
           FirebaseAuth.getInstance().getCurrentUser().getEmail(), 
           FirebaseAuth.getInstance().getCurrentUser().getUid()) 
         ); 
       //getMessagesCount(); 
       Log.d(TAG, "onDataChange: Messages AFTER 1 --- *******************************" + messagesCount); 

       myRef.child(getString(R.string.dbname_messages)) 
         .child(mUser.getUser_id()) 
         .child(FirebaseAuth.getInstance().getCurrentUser().getUid()) 
         .child(String.valueOf(messagesCount)) 
         .setValue(new ChatMessage(input.getText().toString(), 
           FirebaseAuth.getInstance().getCurrentUser().getEmail(), 
           FirebaseAuth.getInstance().getCurrentUser().getUid()) 
         ); 
       Log.d(TAG, "onDataChange: Messages AFTER 2 --- *******************************" + messagesCount); 
      } 
     } 
    }); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == SIGN_IN_REQUEST_CODE) { 
     if (resultCode == RESULT_OK) { 
      Toast.makeText(this, "Signed in successful!", Toast.LENGTH_LONG).show(); 
      showAllOldMessages(); 
     } else { 
      Toast.makeText(this, "Sign in failed, please try again later", Toast.LENGTH_LONG).show(); 

      finish(); 
     } 
    } 
} 

private void showAllOldMessages() { 
    loggedInUserName = FirebaseAuth.getInstance().getCurrentUser().getUid(); 
    Log.d("Main", "user id: " + loggedInUserName); 

    adapter = new MessageAdapter(this, ChatMessage.class, R.layout.item_in_message, 
      FirebaseDatabase.getInstance().getReference().child(getString(R.string.dbname_messages)) 
        .child(FirebaseAuth.getInstance().getCurrentUser().getUid()) 
        .child(mUser.getUser_id())); 
    listView.setAdapter(adapter); 
} 

private User getUserFromBundle(){ 
    Bundle bundle = getIntent().getExtras(); 

    if(bundle != null){ 
     return bundle.getParcelable(getString(R.string.intent_user)); 
    }else{ 
     return null; 
    } 
} 

private void getMessagesCount(){ 
    //messagesCount = 0; 
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference(); 
    Query query = reference.child(getString(R.string.dbname_messages)) 
      .child(FirebaseAuth.getInstance().getCurrentUser().getUid()) 
      .child(mUser.getUser_id()); 
    query.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) { 
      for(com.google.firebase.database.DataSnapshot singleSnapshot : dataSnapshot.getChildren()){ 
       Log.d(TAG, "onDataChange: found post:" + singleSnapshot.getValue()); 
       messagesCount++; 
      } 
      Log.d(TAG, "onDataChange: Messages *******************************" + messagesCount); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

画像:https://i.stack.imgur.com/qc3e9.png

答えて

0

Firebaseデータベースのキーは文字列です。数値(Firebaseが非常に強く推奨する)に数値を入力しても、文字列値として格納されます。これは、キーが辞書的にソートされていることを意味します。そしてその並べ替え順序で"11""8"の前に来ます。あなたは、いくつかのオプションがあり、この問題を解決するには

  • は番号が同じ長さの全てであることを確認します。このシナリオでは0000800011より前になります。
  • Firebase Push IDsをメッセージのキーとして使用します。これらは現在使用している数値よりも視覚的に解析するのが容易ではありませんが、これを解決します(そして多くのその他)。
+0

ありがとうフランク・ヴァン・プフレン。 – TheRapidSloth

関連する問題