【问题标题】:Retrieve value from firebase, increment and insert it to firebase as a new record Android studio从firebase中检索值,增加并将其插入firebase作为新的记录Android工作室
【发布时间】:2021-08-14 15:34:12
【问题描述】:

我有一个如下所示的 firebase 数据库:

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

我想检索插入数据库的最后一条记录,检索“pin”值,将其递增,然后使用新 pin 将新记录添加到 Firebase。 我成功检索了该值,在本例中为 10001,将其递增,并将新引脚分配给 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中的结果是这样的(nrCards和roomName已正确更新):

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

所以 pin 根本没有更新到 de firebase 数据库中。 我试图复制为room_hc.setNrCards 所做的实现,但似乎不起作用...这是因为onComplete() 方法吗? RoomSettingsHelperClass 看起来像这样(仅包含参数、getter 和 setter 以及带和不带参数的构造函数):

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;
    }
}


有人可以帮助将 pin 持久化到数据库中吗?

【问题讨论】:

  • 1) 您能否编辑您的问题以显示queryLastRoom 是如何初始化的? 2)你是如何写入数据库的?我没有看到对 Firebase API 的调用来写入您共享的代码,如果没有它,就很难说写入出了什么问题。
  • 我编辑了它。我正在通过 btn_next.setOnClickListener 写入数据库,如下所示:“room_hc.setRoomName(insertRoomName.getText().toString().trim());” RoomName 是 HelperClass 的一部分 我需要 API 吗?
  • 我在您将新值写入服务器的问题中没有发现任何代码,必须在 RoomSettingsHelperClass 中,您能分享一下吗?
  • 我更新了问题。我在助手类中什么都没有。只是参数、getter 和 setter 以及构造函数

标签: java android firebase firebase-realtime-database


【解决方案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 () && 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 时,具有下一个 ID 的新对象将保存在您的数据库中。数据将存储在数据库中,如下所示

希望以上代码示例对您有所帮助!:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 2021-09-07
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    相关资源
    最近更新 更多