【问题标题】:Duplicating messages in Firebase one to one Chat Application在 Firebase 一对一聊天应用程序中复制消息
【发布时间】:2017-11-27 00:07:19
【问题描述】:

我在将数据实现到 firebase 时遇到了一些麻烦,但它会被重复,并且在单击 fab.setOnClickListener 时向数据库添加消息时出现问题。

我认为在将消息添加到 Firebase 时,这与我的排序有关(我使用 messageCount 进行排序)。那么这里是firebase数据库的代码和图片。

代码:

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

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    Firebase 数据库键是字符串。即使您将数值放入其中(Firebase 强烈建议不要这样做),它们也会存储为字符串值。这意味着键按字典顺序排序:按字符串值。在这种排序顺序中,"11" 排在"8" 之前。

    要解决此问题,您有几个选择:

    • 确保所有数字的长度相同。在那种情况下,00008 位于 00011 之前。
    • 使用Firebase Push IDs 作为消息的键。虽然这些数字不像您现在使用的数字那样容易直观地解析,但它们解决了这个(以及许多其他)问题。

    【讨论】:

    • 感谢 Frank van Puffelen。
    猜你喜欢
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多