我有一个创建座位的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方法中启动的驱动程序字段表示
使用云计算器解决了问题,但仍然不知道为什么火焰参考被掠过
答案 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) {
}
});
}