我将Firebase DB用作Android应用程序的数据库。我需要检查db是否包含具有名称的对象,该名称会赋予用户。如果是,我将引用保存到该文件并加载数据,例如-显示有关对象名称不正确的信息。
例如,我使用了: Firebase querying data
代码:
private void setListReferance(){
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(Config.ADDLIST);
// Set up the input
final EditText input = new EditText(this);
// Specify the type of input expected; this, for example, sets the input as a password, and will mask the text
input.setInputType(InputType.TYPE_CLASS_TEXT);
builder.setView(input);
// Set up the buttons
builder.setPositiveButton(Config.OK, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String listName = input.getText().toString();
boolean correctName = checkListName(shoplistsRef, listName);
if(correctName){
listRef = shoplistsRef.child(listName);
myAdapter.setItemsListRef(listRef);
myAdapter.notifyDataSetChanged();
firebaseUpdate();
}
else{
String messege = "Niepoprawna nazwa listy";
Toast.makeText(MainActivity.this,
messege, Toast.LENGTH_LONG).show();
}
}
});
builder.setNegativeButton(Config.CANCEL, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.show();
}
检查db是否包含的方法。对于测试,我添加了吐司。
private boolean checkListName(DatabaseReference ref, String listName){
boolean[] result = new boolean[1];
Query query = ref.child(listName);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
Toast.makeText(MainActivity.this,
ref.toString(), Toast.LENGTH_LONG).show();
Toast.makeText(MainActivity.this,
dataSnapshot.getValue(String.class), Toast.LENGTH_LONG).show();
result[0] = true;
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return result[0];
}
问题是当我写正确的名称(DB拥有它)时,从else块setListReferance()中显示的第一个吐司(根本不应该显示),然后从if(dataSnapshot.exists()){}中显示两个吐司。
为什么会发生?我认为同步和异步方法存在问题,但我不知道如何解决。
答案 0 :(得分:0)
Firebase是一种异步设计。查阅Google文档Read and Write using Firebase
Firebase数据被写入FirebaseDatabase引用,并通过将异步侦听器附加到该引用来进行检索。数据的初始状态会触发一次侦听器,数据的任何更改都会触发一次。
这样做:“ boolean [] result = new boolean 1;”由于异步实现而无法使用。确保有时您可能会由于某种原因而幸运,并且会看到价值更新,但不一致。原因是,您要在数据包运行到Firebase数据库的同时声明该值,以获取其值,然后这就是混乱发生的地方,该值会更新,然后然后数据包到达返回,但为时已晚,值已经更新。
一种解决方法是使用这样的回调侦听器:
Integer