gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:28:21 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com