簡體   English   中英

每次單擊按鈕時,都會在Firebase中創建節點

[英]Nodes are getting created in Firebase everytime I click a button

感謝您的幫助。 我正在創建一個運行良好的Android應用。 但是我面臨一個小問題。 該應用程序包含已發布廣告的消息功能。 當用戶打開廣告時,會收到兩個呼叫或消息選項,其中,如果用戶單擊消息按鈕,則將其發送到聊天屏幕,在按下按鈕時,信息將存儲在Firebase數據庫中,但是我希望信息僅是第一次存儲,如果用戶下次單擊該按鈕,則應將其帶到預先生成的節點上,而不是新的節點上。

下面是單擊按鈕添加新節點的代碼。 請讓我知道是否有任何方法可以阻止每次單擊按鈕時生成節點:

 mChat.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Intent chatIntent = new Intent(ExpandActivity.this, ChatActivity.class);
                        chatIntent.putExtra("user_id", mId);
                        chatIntent.putExtra("user_name", mName);
                        chatIntent.putExtra("ad_id", user_id);
                        chatIntent.putExtra("cow", m);
                        startActivity(chatIntent);

                mRootRef.child("Chat").child(uid).addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {

                        DatabaseReference user_message_push = mRootRef.child("Chat").child(uid).push();

                        m = user_message_push.getKey();


                        if (!dataSnapshot.hasChild(user_id)) {
                            mRootRef.child("AdvertData").child(user_id).addValueEventListener(new 

ValueEventListener() {
                                        @Override
                                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                            if (dataSnapshot.exists()) {
                                                String image = dataSnapshot.child("image").getValue().toString();
                                                String title = dataSnapshot.child("title").getValue().toString();
                                                String price = dataSnapshot.child("price").getValue().toString();

                                                Map chatAddMap = new HashMap();
                                                chatAddMap.put("seen", false);
                                                chatAddMap.put("timestamp", ServerValue.TIMESTAMP);
                                                chatAddMap.put("image", image);
                                                chatAddMap.put("title", title);
                                                chatAddMap.put("price", price);
                                                chatAddMap.put("chatUser", mName);
                                                chatAddMap.put("ads", user_id);
                                                chatAddMap.put("chatUserId", mId);


                                                 Map chatAddMap1 = new HashMap();
                                                chatAddMap1.put("seen", false);
                                                chatAddMap1.put("timestamp", ServerValue.TIMESTAMP);
                                                chatAddMap1.put("image", image);
                                                chatAddMap1.put("title", title);
                                                chatAddMap1.put("price", price);
                                                chatAddMap1.put("chatUser", name);
                                                chatAddMap1.put("ads", user_id);
                                                chatAddMap1.put("chatUserId", uid);


                                                Map chatUserMap = new HashMap();
                                                chatUserMap.put("Chats/" + uid + "/" + m, chatAddMap);
                                                chatUserMap.put("Chats/" + mId + "/" + m, chatAddMap1);


mRootRef.updateChildren(chatUserMap, new DatabaseReference.CompletionListener() {
                                                @Override
                                                public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {

                                                    if (databaseError != null) {

                                                        Log.d("CHAT_LOG", databaseError.getMessage().toString());

                                                    }

                                                }
                                            });

下面是我的數據庫的外觀圖:

在此處輸入圖片說明

這是邏輯..! 使用addListenerForSingleValueEvent 它僅被調用一次。 並且僅在快照不存在時獲取密鑰

  DatabaseReference user_message_Ref = mRootRef.child("Chat").child(uid);
   // First check if snapshot exist()

     user_message_Ref.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                    if(dataSnapshot.exists())     
                    {
                         // GO TO THE DESIRED ACTIVITY
                       navigateToYOURActivity();

                    }else
                    {

                         // GET KEY 
                      String key = user_message_Ref.push().getKey();
                        // & UPDATE DATABASE                          
                    }
                }

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

                }
            });

我希望信息僅是第一次存儲,如果用戶下次單擊該按鈕,則應將其帶到預先生成的節點

這可能是由於addValueEventListener()

您可以嘗試使用addListenerForSingleValueEvent() ,我猜這只能執行一次。

當您使用以下代碼行時:

DatabaseReference user_message_push = mRootRef.child("Chat").child(uid).push();
m = user_message_push.getKey();

您每次單擊按鈕都會生成一個新的隨機ID。 這就是push()方法的作用。 如果要第二次單擊按鈕以訪問相同的引用,則應將該ID存儲在變量中,然后再次使用相同的變量, 而不要生成另一個變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM