Извлеките значение из firebase, увеличьте и вставьте его в firebase в качестве новой записи Android studio

# #java #android #firebase #firebase-realtime-database

Вопрос:

У меня есть база данных firebase, которая выглядит так:

 mygame01-default-rtdb
-Rooms
      -1
         -nrCards: 5
         -pin: 10001
         -roomName: Test
      ...

 

Я хочу получить последнюю запись, вставленную в базу данных, получить значение «pin», увеличить его, а затем добавить новую запись в Firebase с новым pin-кодом.
Мне удается получить значение, которое в данном случае равно 10001, увеличить его и присвоить новый pin room_hc.setPin -код . Но это не работает.
Все происходит внутри onClickListener() метода:

 DatabaseReference ref;
RoomSettingsHelperClass room_hc;
private int nrCardsCount=1, pinNumberIncrement;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_room_settings);

room_hc=new RoomSettingsHelperClass();
ref= FirebaseDatabase.getInstance().getReference().child("Rooms");
final Query queryLastRoom = ref.orderByKey().limitToLast(1);

btn_next.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //take room name from user and insert it into firebase
        room_hc.setRoomName(insertRoomName.getText().toString().trim());
        //take nr of cards from user and insert it into firebase
        int intNrCards=Integer.parseInt(nrCards.getText().toString().trim());
        room_hc.setNrCards(intNrCards);

        //take last pin added in firebase, increment it and send new value to firebase (new record)
        queryLastRoom.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DataSnapshot> task) {
                if(task.isSuccessful()){
                    for(DataSnapshot snapshot:task.getResult().getChildren()){
                        int lastPin=snapshot.child("pin").getValue(Integer.class);
                        pinNumberIncrement=lastPin 1;
                        txtpinNumber.setText("" pinNumberIncrement);
                        Log.d("TAG", "Pin:"   lastPin);
                        Log.d("TAG", "New pin:"   txtpinNumber.getText());
                        int pinCount = Integer.parseInt(txtpinNumber.getText().toString().trim());
                        Log.d("TAG", "Pin count:"   pinCount);
                        room_hc.setPin(pinCount);
                        Log.d("TAG", "Final pin:"   room_hc.getPin());
                    }
                }else{
                    Log.d("TAG", task.getException().getMessage());
                }
            }
        });
});
 

Результатом выполнения сообщения является следующее:

 D/TAG: Pin:10001
    New pin:10002
    Pin count:10002
D/TAG: Final pin:10002
 

Но результат в базе данных firebase таков (карточки NR и имя комнаты были обновлены правильно):

 mygame01-default-rtdb
-Rooms
      -1
         -nrCards: 5
         -pin: 10001
         -roomName: Test
      -2 
         -nrCards: 4
         -roomName: Test2
 

Таким образом, pin-код вообще не обновляется в базе данных de firebase.
Я попытался скопировать реализацию , сделанную для room_hc.setNrCards , но, похоже, это не так work…Is это из-за onComplete() метода?
Класс roomsettingshelper выглядит следующим образом (содержит только параметры, геттеры и сеттеры, а также конструктор с параметрами и без параметров):

 package com.game.mygame;

public class RoomSettingsHelperClass {
    private String roomName;
    private Integer pin;
    private Integer nrCards;
    private Integer pinNumber;

    public RoomSettingsHelperClass() {
    }

    public RoomSettingsHelperClass(String roomName, Integer pin, Integer nrCards, Integer pinNumber) {
        this.roomName = roomName;
        this.pin = pin;
        this.nrCards = nrCards;
        this.pinNumber=pinNumber;
    }

    public String getRoomName() {
        return roomName;
    }

    public void setRoomName(String roomName) {
        this.roomName = roomName;
    }

    public Integer getPin() {
        return pin;
    }

    public void setPin(Integer pin) {
        this.pin = pin;
    }

    public Integer getNrCards() {
        return nrCards;
    }

    public void setNrCards(Integer nrCards) {
        this.nrCards = nrCards;
    }

    public Integer getPinNumber() {
        return pinNumber;
    }

    public void setPinNumber(Integer pinNumber) {
        this.pinNumber = pinNumber;
    }
}


 

Может ли кто-нибудь помочь сделать пин-код постоянным в базе данных, пожалуйста?

Комментарии:

1. 1) Можете ли вы отредактировать свой вопрос, чтобы показать, как queryLastRoom он инициализируется? 2) Как вы пишете в базу данных? Я не вижу никаких вызовов API Firebase для записи в коде, которым вы поделились, и без этого будет трудно сказать, что не так с записями.

2. Я отредактировал его. Я записываю в базу данных с помощью btn_next.setOnClickListener примерно так: «room_hc.setRoomName(имя файла.getText().toString().trim());» Имя комнаты является частью класса поддержки Мне нужен API?

3. Я не нашел кода в вашем вопросе, где вы записываете новые значения на сервер , должно быть, в RoomSettingsHelperClass , вы можете поделиться этим?

4. Я обновил вопрос. У меня нет ничего в вспомогательном классе. Только параметры, геттеры и сеттеры, а также конструктор

Ответ №1:

Похоже, вы не установили значение в базе данных после увеличения. Взгляните на приведенный ниже пример кода, который поможет вам сохранять объекты постепенно.

 public class MainActivity extends AppCompatActivity {
    DatabaseReference mDatabase;
    DatabaseReference databaseReference;
    Button addButton;
    Test test;

    @Override
    protected void onCreate ( Bundle savedInstanceState ) {
        super.onCreate ( savedInstanceState );
        setContentView ( R.layout.activity_main );
        addButton = findViewById ( R.id.addButton );
        mDatabase = FirebaseDatabase.getInstance ().getReference ();
        databaseReference = mDatabase.getRef ();
        final Query queryLast = databaseReference.child ( "Test" ).orderByKey ().limitToLast ( 1 );
        queryLast.get ().addOnCompleteListener ( new OnCompleteListener<DataSnapshot> () {
            @Override
            public void onComplete ( @NonNull Task<DataSnapshot> task ) {
                if (task.isSuccessful () amp;amp; null != task.getResult ()) {
                    for (DataSnapshot snapshot : task.getResult ().getChildren ()) {
                        Gson gson = new Gson ();
                        JsonElement jsonElement = gson.toJsonTree ( snapshot.getValue () );
                        test = gson.fromJson ( jsonElement, Test.class );
                        Log.d ( "TEST-LOG", "Last:"   test.toString () );
                    }
                } else {
                    Log.d ( "TEST-LOG", "No Data" );
                }
            }
        } );
        addButton.setOnClickListener ( new View.OnClickListener () {
            @Override
            public void onClick ( View v ) {
                if (null != test) {
                    test.setId ( test.getId ()   1 );
                    test.setName ( "Test"   test.getId () );
                } else {
                    test = new Test ( 1, "Test1" );
                }
                databaseReference.child ( "Test" ).child ( String.valueOf ( test.getId () ) ).setValue ( test );
                Log.d ( "TEST-LOG", "Added:"   test.toString () );
            }
        } );
    }

    private static class Test {
        Integer id;
        String name;

        public Test ( Integer id, String name ) {
            this.id = id;
            this.name = name;
        }

        public Integer getId () {
            return id;
        }

        public void setId ( Integer id ) {
            this.id = id;
        }

        public String getName () {
            return name;
        }

        public void setName ( String name ) {
            this.name = name;
        }

        @Override
        public String toString () {
            return "Test{"  
                    "id="   id  
                    ", name='"   name   '''  
                    '}';
        }
    }
}
 

Использовал GSON для анализа данных из базы данных

 implementation 'com.google.code.gson:gson:2.8.7'
 

Когда вы нажмете addButton в своем действии, в вашей базе данных будет сохранен новый объект со следующим идентификатором. Данные будут храниться в базе данных, как показано ниже

База данных в реальном времени

Надеюсь, приведенный выше пример кода поможет вам!:)