我想知道当互联网连接突然丢失时如何控制我的 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 上的连接丢失,那么我将无法显示消息。
问题
因为这似乎是唯一的方法。您能否提供一个方法或解决方案来解决这个问题,我不想因为数据库结构不完整而导致我的应用程序崩溃。
最佳答案
在没有事务的情况下,您需要执行一些操作来确保您的应用在不可靠的条件下运行。
按照最容易防止或检测故障的顺序写入数据。您首先写入文件,然后才更新数据库。由于您可能会触发数据库记录上的其他进程,因此在步骤 3 完成之前它们不会被触发。所以你已经在这样做了。
编写您的读取代码,使其能够抵御可能的不完整数据。例如:即使 URL 已进入数据库,也不要假设文件是正确的,甚至是存在的。当您在单独的读取操作中从数据库读取多个节点时,请按照最容易检测不完整或损坏数据的顺序读取它们,并在这种情况下跳过该项目。
运行常规批处理来清理孤立数据。我承认,这通常不值得付出代价,但尽可能保持数据正确是一个良好的卫生问题。
关于android - Firebase 处理连接突然丢失的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47319764/