【问题标题】:Firebase exception handling around .setValue().setValue() 周围的 Firebase 异常处理
【发布时间】:2018-10-03 10:26:38
【问题描述】:

以下代码将数据插入 Firebase 数据库,并且当我的 Android 设备具有网络连接时运行良好。但是,如果我离线,它不会直接与在线数据库同步。如果它被缓存而不是直接同步,我希望得到通知。

DatabaseReference databaseIssue;
databaseIssue = FirebaseDatabase.getInstance().getReference("Issue");

String timeDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());

databaseIssue.child(timeDate).setValue("test");

有没有办法实现类似简单的try/catch之类的东西:

databaseIssue.child(timeDate).setValue("test");

如果数据只被缓存,会出现问题吗?

来自 Firebase 文档 (https://firebase.google.com/docs/database/admin/save-data)

添加完成回调

DatabaseReference dataRef = ref.child("data");
dataRef.setValueAsync("I'm writing data", new DatabaseReference.CompletionListener() {
  @Override
  public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
    if (databaseError != null) {
      System.out.println("Data could not be saved " + databaseError.getMessage());
    } else {
      System.out.println("Data saved successfully.");
    }
  }
});

设置值确实会引发其他异常: Firebase: Permission denied - setValue()

如果firebase无法连接到在线数据库并且必须缓存数据,是否会抛出异常?如果数据正在缓存或同步,有没有办法记录?

网络连接和离线写入

Firebase Node.js 和 Java 客户端维护自己的 >任何活动数据的内部版本。什么时候 数据被写入,它首先被写入这个本地版本。客户端 然后将该数据与数据库和其他客户端同步 在“尽力而为”的基础上。

因此,所有对数据库的写入都会触发本地事件 立即,甚至在任何数据写入数据库之前。 这意味着当您使用 Firebase 编写应用程序时,您的应用程序 无论网络延迟或互联网如何,都将保持响应 连接性。

一旦重新建立连接,我们将收到相应的集合 事件,以便客户端“赶上”当前服务器 状态,无需编写任何自定义代码。

【问题讨论】:

  • 你的数据库规则是什么?您的数据库规则可能会导致问题。
  • { "rules": { ".read": true, ".write": "auth != null" } }
  • 我在您的问题中阅读了两个不同的问题:1:您可以在在线时保存数据,但在离线时不能。 2:您收到权限被拒绝错误。请具体说明您的问题。
  • @AndréKool 我更新了我的问题,抱歉没有说清楚。

标签: android firebase firebase-realtime-database


【解决方案1】:

我希望这对你有用

下面一行放入你的应用程序类onCreate()方法

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

它会缓存数据,当互联网连接到来时,它会将数据同步到firebase数据库

【讨论】:

  • 有什么方法可以知道数据是被缓存而不是同步到数据库吗?
【解决方案2】:

在未连接到 Firebase 服务器时写入数据库不会被视为错误情况。所以在这种情况下不会抛出错误。

您可以做的最好的事情是通过将侦听器附加到.info/connected 来检测您是否单独连接到 Firebase 服务器,如detecting connection state 上的文档中所示。当.info/connectedfalse 时,您的应用未连接到网络,因此本地写入将排队。

【讨论】:

  • 听起来很有希望会检查一下。
【解决方案3】:

在您的项目中检查您对 firebase 控制台的权限,如下面的代码.. { “规则”:{ “.read”:是的, “.write”:真 } }

我希望你在 android 清单文件中添加互联网权限..

    <uses-permission android:name="android.permission.INTERNET"/>

所有事情都是检查你以正确的方式插入数据。 如果有任何问题,您可以参考此链接.. https://www.simplifiedcoding.net/firebase-realtime-database-crud/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多