我一直在将数据实现到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
firebase数据库密钥是字符串。即使您将数字值放入其中(Firebase建议非常强烈地反对),它们也会作为字符串值存储。这意味着按键在词典上进行分类:按字符串值。用这种顺序 "11"
出现在 "8"
之前。
要解决此问题,您有一些选择:
- 确保数字的长度相同。在这种情况下,
00008
是在00011
之前。 - 使用Firebase推送ID作为消息的键。虽然这些在视觉上比现在使用的数字更容易视觉解析,但它们解决了这个问题(和许多其他问题)。