【问题标题】:How to check if database reference child exists如何检查数据库引用子项是否存在
【发布时间】:2017-08-03 13:09:06
【问题描述】:

我正在聊天,想知道如何为一次对话设置一个 ID。当您给某人写信时,id 是“yourId+friendId”,所以如果您的朋友想回复您,他​​的 conversationId 应该仍然是“myId+hisId”。
我必须设置databasereference child id,但在此之前我需要检查id“yourId+friendId”是否存在。我不知道怎么做。 这是我的代码:

databaseMessages= FirebaseDatabase.getInstance().getReference("conversation");
firebaseAuth=FirebaseAuth.getInstance();

if(databaseMessages.child(chattingUser.getUserId()+", "+firebaseAuth.getCurrentUser().getUid())!=null) {
        databaseMessagesChild = databaseMessages.child(chattingUser.getUserId() + ", " + firebaseAuth.getCurrentUser().getUid());
    }
else {
        databaseMessagesChild = databaseMessages.child(firebaseAuth.getCurrentUser().getUid() + ", " + chattingUser.getUserId());
    }

它不起作用。 如何判断databaseMessages.child(chattingUser.getUserId()+", "+firebaseAuth.getCurrentUser().getUid())是否存在?

这是我的全部代码:

public class Chat extends AppCompatActivity implements View.OnClickListener {

private User chattingUser;
FirebaseAuth firebaseAuth;
DatabaseReference databaseMessages, databaseMessagesChild;
ListView listViewConversation;
List<Message> messageList;


@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.chat_screen);

    databaseMessages= FirebaseDatabase.getInstance().getReference("conversation");
    firebaseAuth=FirebaseAuth.getInstance();

    Intent intent=getIntent();
    chattingUser= (User) intent.getSerializableExtra("User");
    TextView nazwa = (TextView)findViewById(R.id.chat_with);
    nazwa.setText(chattingUser.getNickname());

    listViewConversation=(ListView)findViewById(R.id.list_conversation);
    //listViewConversation.scrollTo(0, listViewConversation.getScrollY());
    messageList=new ArrayList<>();



    databaseMessagesChild = databaseMessages.child(firebaseAuth.getCurrentUser().getUid() + ", " + chattingUser.getUserId());


    DatabaseReference mref=databaseMessages.child(chattingUser.getUserId()+", "+firebaseAuth.getCurrentUser().getUid());
    mref.addValueEventListener(new ValueEventListener() {
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()){
                databaseMessagesChild = databaseMessages.child(chattingUser.getUserId() + ", " + firebaseAuth.getCurrentUser().getUid());
                Log.v("wybralem", "pierwszy host");
                Log.v("i ten klucz to:", databaseMessagesChild.getKey());

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

        }
    });








/*
    if(databaseMessages.child(chattingUser.getUserId()+", "+firebaseAuth.getCurrentUser().getUid())!=null) {
        databaseMessagesChild = databaseMessages.child(chattingUser.getUserId() + ", " + firebaseAuth.getCurrentUser().getUid());
        Log.v("wybralem", "pierwszy host");
    }
    else {
        databaseMessagesChild = databaseMessages.child(firebaseAuth.getCurrentUser().getUid() + ", " + chattingUser.getUserId());
        Log.v("wybralem", "drugi host");
    } */


    Button send = (Button)findViewById(R.id.send_button);
    send.setOnClickListener(this);

}





@Override
protected void onStart() {
    super.onStart();
    Log.v("KEY",databaseMessagesChild.getKey());
    databaseMessagesChild.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            messageList.clear();

            for(DataSnapshot usersSnapshot : dataSnapshot.getChildren()){
                Message messages = usersSnapshot.getValue(Message.class);
                messageList.add(messages);

            }

            MessagesList adapter = new MessagesList(Chat.this, messageList);
            listViewConversation.setAdapter(adapter);

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}






@Override
public void onClick(View v) {
    int i = v.getId();

    if(i==R.id.send_button){
        EditText message_field= (EditText) findViewById(R.id.message_field);
        String message_text=message_field.getText().toString();
        message_field.setText("");
        String myId=firebaseAuth.getCurrentUser().getUid().toString();
        Message message = new Message(myId, chattingUser.getUserId() , message_text);
        //Toast.makeText(Chat.this, firebaseAuth.getCurrentUser().getUid(), Toast.LENGTH_SHORT ).show();

        databaseMessagesChild.push().setValue(message);


    }

}

}

【问题讨论】:

    标签: android firebase firebase-realtime-database firebase-authentication


    【解决方案1】:

    试试这个:

    DatabaseReference mref=databaseMessages.child(chattingUser.getUserId()+", "+firebaseAuth.getCurrentUser().getUid());
    
    mref.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if (dataSnapshot.exists()){
    
                        }
    
                    }
                    @Override
                    public void onCancelled(DatabaseError databaseError) {
    
                    }
                });
    

    【讨论】:

    • 但是当我开始意图时,如何在 onCrearte 方法中检查它是否只存在一次?我尝试了您的解决方案,并且每次发送消息时都会进行检查。
    • 当然,我加了全班
    • 你有两种方法,一种是添加一个标志来检查代码是否是第一次执行的简单方法,另一种是尝试将 addValueEventListener() 更改为addListenerForSingleValueEvent()
    • 还有一个问题。如果我从第一个帐户开始新对话,我无法从 onStart 方法中的第二个帐户 bcs 获取消息 databaseMessagesChild 始终具有相同的 ID。它从第一个实例而不是 mref onDataChange 保存 id。我已经尝试了所有方法,但无法处理,您能帮帮我吗?
    • 但是在 onClick 方法中 databaseMessagesChild 有很好的 id,所以我不知道为什么只有在 onStart 方法中 id 是错误的
    【解决方案2】:
    databaseReference.orderByChild("id").equalTo(yourId + friendId).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                // Data exists
            }
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2010-10-24
      • 2016-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多