android - Firebase 处理连接突然丢失的情况

标签 android firebase firebase-realtime-database database-connection firebase-storage

我想知道当互联网连接突然丢失时如何控制我的 firebase 写入请求。为了解释我的问题,我将举这个例子:

示例

假设我一次执行 3 次写入:

1) WRITE 1 :表示将图像上传到 Firebase 存储。

2) WRITE 2 :表示将另一个图像上传到 Firebase 存储。

3) WRITE 3:表示将(WRITE 1)和(WRITE 2)的url链接存储到实时数据库中。

一次执行 3 次写入的合理方法是根据每个的完整监听器将它们链接起来

像这样:

 //WRITE 1 

 storageref.putfile(image1).addOnCompleteListener(new OnCompleteListener{

     //get link of this write and do WRITE 2 

      //WRITE 2 

       storage ref.putfile(image2).addOnCompleteListener(new OnCompleteListener{

          //get the link of this write and do WRITE 3

         // WRITE 3 
           Map links=new HashMap();
           links.put("image1", link1);
           links.put("image2", link2);  
           databaseref.child("images").setValue(links).addOnCompleteListener(new OnCompleteListener{

             //show a message

        });

  });
  });

正如您所看到的,实现这一目标的唯一方法是将它们链接在一起,这样当一个写入完成时,另一个就会执行,依此类推。

问题

情况 1:如果 WRITE 1 时连接丢失,则其他写入将无法完成。

情况 2:如果在 WRITE 2 上连接丢失,则最后一次写入将不会执行,并且最终会在存储上留下无用的文件。因为我无法将它们发送到数据库。

情况 3:如果 WRITE 3 上的连接丢失,那么我将无法显示消息。

问题

因为这似乎是唯一的方法。您能否提供一个方法或解决方案来解决这个问题,我不想因为数据库结构不完整而导致我的应用程序崩溃。

最佳答案

在没有事务的情况下,您需要执行一些操作来确保您的应用在不可靠的条件下运行。

  1. 按照最容易防止或检测故障的顺序写入数据。您首先写入文件,然后才更新数据库。由于您可能会触发数据库记录上的其他进程,因此在步骤 3 完成之前它们不会被触发。所以你已经在这样做了。

  2. 编写您的读取代码,使其能够抵御可能的不完整数据。例如:即使 URL 已进入数据库,也不要假设文件是​​正确的,甚至是存在的。当您在单独的读取操作中从数据库读取多个节点时,请按照最容易检测不完整或损坏数据的顺序读取它们,并在这种情况下跳过该项目。

  3. 运行常规批处理来清理孤立数据。我承认,这通常不值得付出代价,但尽可能保持数据正确是一个良好的卫生问题。

关于android - Firebase 处理连接突然丢失的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47319764/

相关文章:

angular - Firestore 每日配额

ios - 当分支头是 UUID 时检索 firebase 实时数据库

node.js - 如果计数达到 0,Firebase 云函数事务将删除 Node

android - Android 中的 EditText 小部件

java - 在线获取原始格式的 JSON URL

安卓:布局。编辑文本滚动?

Cordova 未捕获类型错误: Cannot read property 'verifyPhoneNumber' of undefined

ios - Firebase-数据库结构效率与平坦度

android - 在 Android 上自动连接到已配对的蓝牙设备

ios - 除非用户登录,否则无法从Firebase检索数据