函数来检查firebase数据库中是否存在值(变量需要是final或实际上是final)



我需要一个函数来检查firebase实时数据库中是否存在值。我试着写下面的代码:

public boolean esiste(String desc, DatabaseReference meseref){
boolean exists = false;
meseref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if(snapshot.child(desc).exists()){
exists = true;
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
return exists;
}

也许这不是最好的方法,但对我来说似乎很简单(我不是一个专业的程序员(。问题是编译器说";变量"exists"是从内部类中访问的,需要是final或实际上是final";,我有一个错误。

那么,我如何制作一个函数来检查该值是否存在呢?

非常感谢

您有两个独立的问题,编译器错误和概念错误。为了获得所需的结果,您需要重新构造代码以修复概念错误,但也应该尝试理解现有代码中的编译器错误。

关于编译器错误,请参阅本问题中对匿名内部类中有效的最终变量的解释。

(您在示例中没有提供导入,所以我猜测您在下面提供的链接中使用的框架(。

对于概念错误,根据文档,addListenerForSingleValueEvent方法的目的是注册一个侦听器,如果DatabaseReference引用的值发生变化,该侦听器将被通知(异步,即在另一个线程中(。即使编译了代码,注册监听器也会立即返回,并且exists变量的值将取决于监听器是否在代码到达return语句之前的很短时间内更新了变量的值。

相反,您需要直接检查该值。为此,我认为您需要get方法。此方法也是异步的,但工作方式不同。它为您提供了一个Task,您需要等待Task完成(使用Tasks.await(,然后才能检索其值。

代码应该是这样的:

public boolean esiste(String desc, DatabaseReference meseref){
Task<DataSnapshot> task = meseref.get();
DataSnapshot dataSnapshot = Tasks.await(task);
return snapshot.child(desc).exists();
}

最新更新