Узлы создаются в Firebase каждый раз, когда я нажимаю кнопку - PullRequest
0 голосов
/ 20 сентября 2018

Спасибо за помощь.Я создаю приложение для 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());

                                                    }

                                                }
                                            });

Ниже показано, как выглядит моя база данных:

enter image description here

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Когда вы используете следующие строки кода:

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

Вы генерируете новый случайный идентификатор при каждом нажатии кнопки.Это то, что делает метод push().Если вы хотите во второй раз нажать кнопку, чтобы получить доступ к той же ссылке, вам следует сохранить этот идентификатор в переменной и снова использовать эту же переменную, не сгенерировать еще одну.

0 голосов
/ 20 сентября 2018

Вот логика ..!Используйте 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) {

                }
            });
0 голосов
/ 20 сентября 2018

Я хочу, чтобы информация сохранялась только в первый раз, и если пользователь нажимает кнопку в следующий раз, его следует перенести на предварительно сгенерированный узел

Вероятно, потому, чтоaddValueEventListener().

Вы можете попробовать использовать addListenerForSingleValueEvent(), что, как я полагаю, происходит только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...