在Android上没有从Firebase调用setValue onComplete

时间:2017-03-28 14:39:35

标签: android firebase firebase-realtime-database

我使用安全规则来确定可以将值写入数据库的条件。目前我已经设置了安全规则,这些工作正常(我使用模拟器检查过),所以到目前为止没有问题。

如果拒绝写入权限(不符合安全规则),我想采取一些行动。为了做到这一点,我计划在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;

0 个答案:

没有答案