Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每次我单击按钮时,都会在Firebase中创建节点_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java 每次我单击按钮时,都会在Firebase中创建节点

Java 每次我单击按钮时,都会在Firebase中创建节点,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,谢谢你的帮助。我正在创建一个运行良好的Android应用程序。但我面临一个小问题。该应用程序包含发布广告的消息功能。当用户打开广告时,他会收到两个呼叫或消息选项,如果用户单击消息按钮,他将被发送到聊天屏幕,按下按钮时,信息将存储在firebase数据库中,但我希望信息仅第一次存储,如果用户下次单击按钮,则应将其带到预生成的节点,而不是新节点 下面是我单击按钮添加新节点的代码。请告诉我是否有任何方法可以阻止每次单击按钮时生成节点: mChat.setOnClickListener(new Vie

谢谢你的帮助。我正在创建一个运行良好的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());

                                                    }

                                                }
                                            });
下图显示了我的数据库的外观:

我希望信息只存储第一次,如果 用户下次单击按钮时,应将其带到 预生成节点

这可能是因为
addValueEventListener()


您可以尝试使用
addListenerForSingleValueEvent()
,我想这只会执行一次。

当您使用以下代码行时:

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

每次单击按钮都会生成一个新的随机id。这就是
push()
方法所做的。如果您希望第二次单击按钮访问相同的引用,则应将该id存储在变量中,然后再次使用相同的变量,生成另一个变量。

以下是逻辑。。!使用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) {

                }
            });