java - 聊天应用程序中的 Firebase 实时数据库无法按时间检索消息

标签 java android firebase firebase-realtime-database

a photo 当我从 Firebase 检索聊天消息时,它检索它们时没有发送时间消息

我尝试了 orderbychild(timestamp); 但它不适用于我的情况

    Intent intent;
    List<ChatModel> data;
    private RecyclerView mRecy;
    ChatAdapter chatAdapter;
    String mId;
    Button sendmessage;
    private EditText mEditWriteMessage;
    FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
    ChatModel chatModel;
    ChatModel chatModel2;




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mechanic_profile);
        sendmessage = findViewById(R.id.sendmessage);
        mEditWriteMessage = findViewById(R.id.editWriteMessage);
        intent = getIntent();
        data = new ArrayList<>();
        chatAdapter = new ChatAdapter(getApplicationContext(), data);
        mRecy = findViewById(R.id.recy);

        mRecy.setHasFixedSize(true);


        mRecy.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
        mRecy.setAdapter(chatAdapter);

        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("CHHAATS");

        DatabaseReference databaseReference1 = FirebaseDatabase.getInstance().getReference("CHHAATS");

        databaseReference1.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
        for(DataSnapshot snapshot  : dataSnapshot.getChildren()) {
    chatModel2 = snapshot.getValue(ChatModel.class);

    if (chatModel2.getFrom().equals(firebaseUser.getUid()) && chatModel2.getTo().equals(intent.getStringExtra("receiver"))
            || chatModel2.getFrom().equals(intent.getStringExtra("receiver")) && chatModel2.getTo().equals(firebaseUser.getUid())) {


        data.add(chatModel2);

    }


            chatAdapter.notifyDataSetChanged();

            mRecy.scrollToPosition(data.size() - 1);

        }
    }



    @Override
    public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
        for(DataSnapshot snapshot  : dataSnapshot.getChildren()) {

            chatModel2 = snapshot.getValue(ChatModel.class);
        }
            if (chatModel2.getFrom().equals(firebaseUser.getUid()) && chatModel2.getTo().equals(intent.getStringExtra("receiver"))
                    || chatModel2.getFrom().equals(intent.getStringExtra("receiver")) && chatModel2.getTo().equals(firebaseUser.getUid())) {


                data.add(chatModel2);



            chatAdapter.notifyDataSetChanged();

            mRecy.scrollToPosition(data.size() - 1);

        }

    }

    @Override
    public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

    }

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

    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
});

        sendmessage.setOnClickListener(new View.OnClickListener()

            {
                @Override
                public void onClick (View v){
                String message = mEditWriteMessage.getText().toString();
                String receiver = intent.getStringExtra("receiver");
                String sender = firebaseUser.getUid();
                meth(message, receiver, sender);
            }
            });
        }

        void meth (String message, String receiver, String sender){

            DatabaseReference reference = FirebaseDatabase.getInstance().getReference("CHHAATS");
            HashMap<String, Object> hashMap = new HashMap<>();

            hashMap.put("text", message);
            hashMap.put("from", sender);
            hashMap.put("to", receiver);
            reference.child(receiver).push().setValue(hashMap);


        }


    }





实际结果是消息检索而不查看其时间 我需要的是按日期和时间检索消息,但 firebase 会做另一件事

最佳答案

您可能想使用 FCM 而不是实时数据库。

当用户发送消息时,

onChildAdded 将在每个设备上触发,这是一个安全问题,并且对性能非常不利,假设您每秒发送 1k 条消息,这会让你的应用程序变得非常非常慢。

我的建议是在数据库中保存每个用户的 Firebase ID,然后使用该 ID 向该特定用户发送通知,看看 FCM接收消息。

要发送消息,我的建议是使用登录 token 对服务器上的用户进行身份验证,您可以从服务器查询 Firebase 来发送消息。 link您还可以使用 Firebase Functions,只需将您的 api_key 放在安全的地方

关于java - 聊天应用程序中的 Firebase 实时数据库无法按时间检索消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55772937/

相关文章:

java - 如何从流中的模型对象获取字段列表并映射到另一个模型对象?

android - 从 WebView 添加日历事件

android - phonegap::gmap 上的动画 gif

android - android源码中的DNS查询

java - firebaserecycleradapter 中的 firebaserecycleradapter() 不能应用于

android - 使用 FirestoreRecyclerAdapter 时如何获取 Firestore 文档 ID?

java - 如何绕过 magnolia cms 中的过滤器链?

java - 在Java中应用NFC : any existing API or libraries?

java - 我如何使用 JUnit 测试 void actionEvent 中的信息

android - FirebaseInstanceIdService 不会被调用