情境:我想将my参数中的 url 与从firebase实时数据库中检索到的 url 进行比较。然而,检索工作,我不知道如何在我的if-else语句中从String比较中获取布尔值,其中我得到一个错误:“无法将值赋给最终变量'bool'”。 / p>
compare()代码:
private boolean compare(String url) {
mDatabaseReference = mFirebaseDatabase.getReference("Executive Branch");
final String newUrl = url;
final boolean bool = false;
mDatabaseReference.limitToFirst(1).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getChildrenCount() > 0) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
ExecutiveOrder executiveOrder = snapshot.getValue(ExecutiveOrder.class);
if (executiveOrder.getUrl().equals(newUrl)) {
bool = true;
} else {
bool = false;
}
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.e("Executive Order", "The read failed: " + databaseError.getDetails());
}
});
return bool;
}
答案 0 :(得分:0)
错误告诉你是什么问题。您正在尝试为最终变量赋值。尝试直接返回true或false。但请注意firebase调用是异步的,这意味着它可能会返回方法底部的默认值。
private boolean compare(String url) {
mDatabaseReference = mFirebaseDatabase.getReference("Executive Branch");
final String newUrl = url;
final boolean bool;
mDatabaseReference.limitToFirst(1).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getChildrenCount() > 0) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
ExecutiveOrder executiveOrder = snapshot.getValue(ExecutiveOrder.class);
if (executiveOrder.getUrl().equals(newUrl)) {
bool = true;
} else {
bool = false;
}
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.e("Executive Order", "The read failed: " + databaseError.getDetails());
}
});
if(bool!=null) < Add a condition to check if bool is null or not
return bool;
else return false;
}
答案 1 :(得分:0)
使变量bool
成为类中的全局变量并删除final
关键字,以便您可以从方法内的任何位置读取和写入值。
答案 2 :(得分:0)
您无法为最终变量指定新值。
如果要访问内部类中的外部类变量,则必须将其声明为final。
一种简单但不优雅的方法是声明一个大小为1的布尔数组。
mDatabaseReference = mFirebaseDatabase.getReference("Executive Branch");
final String newUrl = url;
final boolean[] bool = new boolean[1]; //boolean array of size 1
mDatabaseReference.limitToFirst(1).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getChildrenCount() > 0) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
ExecutiveOrder executiveOrder = snapshot.getValue(ExecutiveOrder.class);
if (executiveOrder.getUrl().equals(newUrl)) {
bool[0] = true; //access the bool value like this
} else {
bool[0] = false;
}
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.e("Executive Order", "The read failed: " + databaseError.getDetails());
}
});
顺便说一句,你犯了一个大错误。你的代码会一直都是假的。
Firebase数据库方法是异步的,意味着它们在一个单独的线程中执行,因此我们无法阻止何时从数据库中检索数据。这取决于你的互联网速度。
所以你必须在onDataChange
方法中调用适当的方法。示例......
private boolean compare(String url) {
mDatabaseReference = mFirebaseDatabase.getReference("Executive Branch");
final String newUrl = url;
mDatabaseReference.limitToFirst(1).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getChildrenCount() > 0) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
ExecutiveOrder executiveOrder = snapshot.getValue(ExecutiveOrder.class);
boolean bool = executiveOrder.getUrl().equals(newUrl);
doSomething(bool); //This method will handle the logic
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.e("Executive Order", "The read failed: " + databaseError.getDetails());
}
});
}
答案 3 :(得分:0)
如果要在onDataChange方法中使用变量,请在onDataChange方法中编写要对该变量执行的所有过程。此方法应将String作为参数(因为我们大多从firebase接收值作为字符串)。现在,在onDataChange方法中调用此方法,并将onDataChange的变量作为该方法的参数传递。
例如:
public void onDataChange(DataSnapshot dataSnapshot) {
String firebaseVariable=dataSnapshot.getValue().toString();
methodToProcess(firebaseVariable);
}
methodToProcess(String firebaseVariable){
//Your processing here
}