我正在尝试使用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没有值。
答案 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());
}
});