从Firebase实时数据库获取计数器的值时出现问题

时间:2019-03-30 09:48:00

标签: java android firebase firebase-realtime-database

我正在尝试使用Firebase数据库获取计数器的值,并将其设置为我的模型ID。

与数据库的连接正在工作,其他方法也可以。现在,我试图不必在每次需要添加新项目时手动为模型设置ID。

问题是应该检索ID的ValueEventListener无法正常工作,这意味着该应用未“输入”该代码。

invia.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        final Data data = new Data();
        FirebaseDatabase database2 = FirebaseDatabase.getInstance();
        DatabaseReference myRef2 = database2.getReference("Counter/node");
        myRef2.addValueEventListener(new ValueEventListener() {
            @Override public void onDataChange(DataSnapshot dataSnapshot) {
                Counter counter = dataSnapshot.getValue(Counter.class);
                data.setId(String.valueOf(counter.getCnt_android() + 1));
            }

            @Override public void onCancelled(DatabaseError databaseError) {
                System.out.println("The read failed: " + databaseError.getCode());
            }
        });

        data.setUser(user.getText().toString());
        data.setPassword(password.getText().toString());

        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference myRef = database.getReference("Information Android/");
        myRef.child(data.getId()).setValue(data);

        Counter cnt_android = new Counter();
        cnt_android.setCnt_android(Integer.parseInt(data.getId()));
        myRef2.child("cnt_android").setValue(cnt_android);
    }
});

我已经尝试过将这两行放进去:

data.setUser(user.getText().toString());
data.setPassword(password.getText().toString());

在onDataChange里面查看获取计数器值是否有问题,但这不是因为它们保持为null,即使我从应用程序内的EditBoxes中给出它们也是如此,所以我开始认为这有问题具体代码。

应用程序在此行崩溃:

myRef.child(data.getId()).setValue(data);

因为该ID没有值。

1 个答案:

答案 0 :(得分:1)

Firebase onDataChange()是异步的,这意味着编译器将移至下一个任务,然后当onDataChange()检索所有数据时,它将被执行。

对于您而言,在onDataChange()之后,您具有以下代码:

 myRef.child(data.getId()).setValue(data);

此操作在onDataChange()之前执行,因此data.getId()返回null。

要解决您的问题,您需要在onDataChange()内添加代码:

    myRef2.addValueEventListener(new ValueEventListener() {
            @Override public void onDataChange(DataSnapshot dataSnapshot) {
            Counter counter = dataSnapshot.getValue(Counter.class);
            data.setId(String.valueOf(counter.getCnt_android() + 1));
            FirebaseDatabase database = FirebaseDatabase.getInstance();
            DatabaseReference myRef = database.getReference("Information Android/");
            myRef.child(data.getId()).setValue(data);

        }

        @Override public void onCancelled(DatabaseError databaseError) {
            System.out.println("The read failed: " + databaseError.getCode());
        }
    });