我使用安全规则来确定可以将值写入数据库的条件。目前我已经设置了安全规则,这些工作正常(我使用模拟器检查过),所以到目前为止没有问题。
如果拒绝写入权限(不符合安全规则),我想采取一些行动。为了做到这一点,我计划在setValue上使用onComplete,如果出现错误,我将不得不做一些代码。
目前,如果符合安全规则,则会将值写入在线数据库,我可以在浏览器中轻松检查。如果由于安全原因没有将值写入数据库,我可以在调试/日志中看到一条错误,说明Permission被拒绝,所以一切都很好。
问题在于,当写入或未写入数据库的值时,根本不会调用onComplete,它甚至不存在于我的代码中。我在调试模式下使用断点检查了这一点。我使用的代码直接来自文档,请参阅下文。
有人有什么想法吗?非常感谢!
dataRef.setValue(frequency, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference dataRef) {
if (databaseError != null) {
System.out.println("Data could not be saved " + databaseError.getMessage());
} else {
System.out.println("Data saved successfully.");
}
}
});
修改
我注意到只有在addValueEventListener / onDataChange中调用setValue方法时才会出现上述行为。如果我将setValue方法移到侦听器之外,则会调用onComplete。这是预期的行为还是一个错误?
更新
经过进一步测试后,我注意到如果在addValueEventListener / onDataChange中调用setValue方法实际上并不重要。如果我在下面的while循环中调用该方法,这很重要。只要它在while循环内,就不会调用onComplete。在这两种情况下,根据安全规则将值写入/不写入数据库。请看以下两种情况:
选项1 - 未调用onComplete
FirebaseDatabase.getInstance().setLogLevel(Logger.Level.DEBUG);
FirebaseDatabase database = FirebaseDatabase.getInstance();
final DatabaseReference databaseReference = database.getReference();
DatabaseReference dataRef = databaseReference.child("Drivers").child("23").child("Frequency");
while (errorStatus == false) {
dataRef.setValue(frequency, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
if (databaseError != null) {
System.out.println("Data could not be saved " + databaseError.getMessage());
errorStatus = false;
frequency = frequency + 1;
} else {
System.out.println("Data saved successfully.");
errorStatus = true;
frequency = 1;
}
}
});
}
选项2 - 调用onComplete。
FirebaseDatabase.getInstance().setLogLevel(Logger.Level.DEBUG);
FirebaseDatabase database = FirebaseDatabase.getInstance();
final DatabaseReference databaseReference = database.getReference();
DatabaseReference dataRef = databaseReference.child("Drivers").child("23").child("Frequency");
dataRef.setValue(frequency, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
if (databaseError != null) {
System.out.println("Data could not be saved " + databaseError.getMessage());
errorStatus = false;
frequency = frequency + 1;
} else {
System.out.println("Data saved successfully.");
errorStatus = true;
frequency = 1;
}
}
});
我确实需要while循环,除非可以找到解决方法吗?
更新
public class MainActivity extends AppCompatActivity {
static boolean errorStatus = false;
static int frequency = 1;