# #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
в своем действии, в вашей базе данных будет сохранен новый объект со следующим идентификатором. Данные будут храниться в базе данных, как показано ниже
Надеюсь, приведенный выше пример кода поможет вам!:)