未识别数据库引用

时间:2017-12-21 06:54:15

标签: android firebase firebase-realtime-database

我有一个创建座位的for循环。我试图检查座位是否已经在我们的数据库中注册(预订),所以当我启动座位时我想进入我的数据库并检查它是否已经存在,所以我在两个中放入一个名为look的方法循环,像这样

for (i = 0; i < maxRow; i++) {
        for (j = 0; j < maxColumn; j++) {
            final SeatMo seat = new SeatMo();
            seat.row = i;
            seat.column = j;
            seat.status = 1;
            look(seat,i,j)
            seatTable[i][j] = seat;
        }
    }

方法外观是引用的位置,当我在数据库中保存座位时,我通过选择的特定座位命名子项,例如col:2 row:3,这是look方法

  private void look(final SeatMo seat, final int a, final int b) {
    databaseRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.hasChild("col:" + i + " row:" + j)) {
                seat.status = 0;
            } else {
                    seat.status = 1;
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
      });
    }

在我看来,我希望它在座位启动时检查每个座位,但由于某些原因我希望你可以在代码中找到,当调用方法外观时,它会跳过引用(databaseRef完全)。我的问题是,什么可能导致引用被跳过,我怎样才能确保它不会被跳过?

databaseRef在Oncreate方法中声明,它是一个字段

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

    if(getSupportActionBar() != null) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }

    currUser = FirebaseAuth.getInstance().getCurrentUser();
    Intent callingIntent = getIntent();
    maxC = Integer.valueOf(callingIntent.getStringExtra("col"));
    maxR = Integer.valueOf(callingIntent.getStringExtra("row"));
    decks = Integer.valueOf(callingIntent.getStringExtra("deck"));
    fare = Double.valueOf(callingIntent.getStringExtra("fare"));
    driver = callingIntent.getStringExtra("id");
    destination = callingIntent.getStringExtra("dest");





    databaseRef = FirebaseDatabase.getInstance().getReference("coach-drivers" + "/" + driver + "/" + "clients" );


    initSeatTable(maxC,maxR);
    selectedSeats = new ArrayList<>();
    mMovieSeatView1= (MovieSeatView) findViewById(R.id.seat_view_one);
    deck = (Spinner) findViewById(R.id.top_bottom);
    mMovieSeatView1.setSeatTable(seatTable);
    mMovieSeatView1.setPresenter(this);



  }

裁判有正确的路线

尝试过将此路线更改为参考

   databaseRef = FirebaseDatabase.getInstance().getReference().child("coach-drivers").child(driver).child("clients");

仍然无法访问onDataChange()和onCancel方法

这是我数据库的Json结构

  {
"coach-drivers": {
    "iiiiiiiiiiiiiii": {
        "clients": {
            "col:3 row:2": "one",
            "col:3 row:1:"one",
             "col:1 row:3" : "one"
            }
        }
    }

 }

iiiiiiiiiii用于driverId,由在OnCreate方法中启动的驱动程序字段表示

使用云计算器解决了问题,但仍然不知道为什么火焰参考被掠过

2 个答案:

答案 0 :(得分:1)

要解决此问题,请移动检查座位是否已在onDataChange()方法中注册的逻辑。您不能简单地在该方法之外使用seat.status,因为该方法的异步行为会使值始终为null

拥有该方法中的所有逻辑,将解决问题。如果想要使用外部值,请参阅此post的答案。

答案 1 :(得分:0)

将您的参考放在外观方法

另请将seatTable[i][j] = seat保留在OnDataChange中,如下所示:

private void look(final SeatMo seat, final int a, final int b) {

    databaseRef = FirebaseDatabase.getInstance().getReference("coach-drivers" + "/" + driver + "/" + "clients" );
    databaseRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.hasChild("col:" + i + " row:" + j)) {
                    seat.status = 0;
                } else {
                    seat.status = 1;
                }
                 seatTable[i][j] = seat;
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
      });


    }