这是我目前的数据库结构,它不起作用,我已经知道它不是实现我想要的正确方法......
{
"Messages" : {
"+918105571584" : {
"+919945342730" : {
"-L5AFX_RMebwd3EiuWUm" : {
"message" : "Hi",
"seen" : false,
"time" : 1518459824840,
"type" : "text"
},
"-L5AFah6msuwW2fCXnMg" : {
"message" : "Hey",
"seen" : false,
"time" : 1518459841703,
"type" : "text"
},
"-L5AFbmLTctRBxXjAkDW" : {
"message" : "Message",
"seen" : false,
"time" : 1518459846120,
"type" : "text"
}
}
},
"+919945342730" : {
"+918105571584" : {
"-L5AFX_RMebwd3EiuWUm" : {
"message" : "Hi",
"seen" : false,
"time" : 1518459824840,
"type" : "text"
},
"-L5AFah6msuwW2fCXnMg" : {
"message" : "Hey",
"seen" : false,
"time" : 1518459841703,
"type" : "text"
},
"-L5AFbmLTctRBxXjAkDW" : {
"message" : "Message",
"seen" : false,
"time" : 1518459846120,
"type" : "text"
}
}
}
},
"Users" : {
"+918105571584" : {
"Email" : "",
"Name" : "Akash",
"Quote" : "",
"Status" : ""
},
"+919945342730" : {
"Email" : "",
"Name" : "Sav",
"Quote" : "",
"Status" : ""
}
}
}
首先是一个孩子的消息和里面的发件人ID(电话号码)接收者ID(电话号码)然后唯一的ID包含消息...所以如果这不是正确的方式来实现一对一的聊天应用程序可以有人电话我应该如何实现这个数据库结构
聊天活动
public class Chat extends AppCompatActivity {
Button addImage;
Button sendButton;
EditText messageArea;
ScrollView scrollView;
TextView name;
FirebaseAuth mAuth;
String MessageSenderId;
String MessageRecieverId;
DatabaseReference rootRef;
RecyclerView userMessageList;
private final List<Messages> messagesList = new ArrayList<>();
private LinearLayoutManager linearLayoutManager;
private MessageAdapter messageAdapter;
FirebaseUser user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
sendButton = (Button) findViewById(R.id.send_message);
messageArea = (EditText) findViewById(R.id.input_message);
scrollView = (ScrollView) findViewById(R.id.scrollView);
addImage = (Button)findViewById(R.id.add_image);
name = (TextView) findViewById(R.id.name);
name.setText((getIntent().getStringExtra("name")));
messageAdapter = new MessageAdapter(messagesList);
userMessageList = (RecyclerView)findViewById(R.id.messageList);
linearLayoutManager = new LinearLayoutManager(this);
userMessageList.setHasFixedSize(true);
userMessageList.setLayoutManager(linearLayoutManager);
userMessageList.setAdapter(messageAdapter);
rootRef = FirebaseDatabase.getInstance().getReference();
user = FirebaseAuth.getInstance().getCurrentUser();
mAuth = FirebaseAuth.getInstance();
MessageSenderId = mAuth.getCurrentUser().getPhoneNumber();
MessageRecieverId = getIntent().getStringExtra("visit_user_id");
fetchMessages();
sendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendMessage();
}
});
}
private void fetchMessages() {
rootRef.child("Messages").child(MessageSenderId).child(MessageRecieverId)
.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Messages messages = dataSnapshot.getValue(Messages.class);
messagesList.add(messages);
messageAdapter.notifyDataSetChanged();
}
@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) {
throw databaseError.toException();
}
});
}
private void sendMessage() {
String messageText = messageArea.getText().toString();
if (TextUtils.isEmpty(messageText)){
Toast.makeText(getApplicationContext(),"Can't Send Blank Message",Toast.LENGTH_SHORT).show();
}
else {
String message_sender_ref = "Messages/" + MessageSenderId + "/" + MessageRecieverId;
String message_reciver_ref = "Messages/" + MessageRecieverId + "/" + MessageSenderId;
DatabaseReference user_message_key = rootRef.child("Messages").child(MessageSenderId)
.child(MessageRecieverId).push();
String message_push_id = user_message_key.getKey();
Map messageTextBody = new HashMap<>();
messageTextBody.put("number",MessageSenderId);
messageTextBody.put("message",messageText);
messageTextBody.put("seen",false);
messageTextBody.put("type","text");
messageTextBody.put("time", ServerValue.TIMESTAMP);
Map messageBodyDetails = new HashMap();
messageBodyDetails.put(message_sender_ref + "/" + message_push_id,messageTextBody);
messageBodyDetails.put(message_reciver_ref + "/" + message_push_id,messageTextBody);
rootRef.updateChildren(messageBodyDetails, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
if (databaseError != null){
Log.d("Chat_Log", databaseError.getMessage().toString());
}
messageArea.setText("");
}
});
}
}
}
答案 0 :(得分:0)
试试这个:
Messages
uniqueid
number:"+918105571584"
"message" : "Hi",
"seen" : false,
"time" : 1518459824840,
"type" : "text"
uniqueid
number: "+919945342730"
"message" : "Hey",
"seen" : false,
"time" : 1518459841703,
"type" : "text"
等。
同时保留Users
节点。
尝试以上操作,具有第一个号码的用户使用第二个号码向用户发送消息。发送消息后,此数据将显示在您的数据库中:
uniqueid
number:"+918105571584"
"message" : "Hi",
"seen" : false,
"time" : 1518459824840,
"type" : "text"
当其他用户看到该消息时,您可以将seen
更新为true。
然后第二个用户发送一条消息,他的数据也将出现在数据库中。
uniqueid
number: "+919945342730"
"message" : "Hey",
"seen" : false,
"time" : 1518459841703,
"type" : "text"
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("messages").push();
ref.child("number").setValue(anumberhere);
ref.child("message").setValue(messagehere);
ref.child("seen").setValue(false);
....