Android - Firebase 离线最佳实践

23

我卡在理解如何使 Firebase 应用离线的概念上了。 根据文档,我们需要调用:

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

但是我们应该在哪里调用它呢?它应该在应用程序的每个Activity中使用吗?因为,当我在我的Application类的onCreate()方法中使用它时,我的应用程序会持续崩溃。

那么,最好的做法是什么,让我们的应用程序脱机使用。

还有一个疑问是上面的方法和DatabaseReference.keepSynced(true);之间的区别。


你可以尝试这个,它会对你有所帮助。 检查这个链接: https://stackoverflow.com/a/54127798/10379874 - Arjun Othayoth
6个回答

21

创建一个应用程序类

public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        FirebaseDatabase.getInstance().setPersistenceEnabled(true);

    }
}

并将您的清单更改为

<application
    android:name=".MyApp"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"

我在使用数据库时需要调用这个吗? - Rekt
5
仅在需要使用 Firebase 数据库的离线属性时才使用此功能。这意味着,如果您处于离线状态,则在您重新联网时它将显示最后获取的值;如果您在离线状态下向数据库推送了某些内容,则此功能可以帮助您在再次联网时将其推送。 - Jinson Paul

13
在检索到数据库的第一个引用之前,应在启动时调用setPersistenceEnabled()一次。我会在直接调用FIRApp.configure()之后立即调用它。
启用持久性允许完全离线保留信息。其中重要的组成部分是,即使您强制关闭应用程序并重新打开它,离线请求和更新也将完成。如果您正在寻找离线访问,则是要设置的布尔值。
保持同步用于情况,在这种情况下,您希望缓存最新数据以备检索信息时使用,但不一定需要在下次打开应用程序时恢复该数据。
如果您有访问已登录用户详细信息的视图,则可以使用此功能。不必在所有使用详细信息的视图上都设置用户详细信息侦听器,只需指定保持同步的数据库引用即可更快地获取最新数据。
有关持久性和同步的更多详细信息可以在Firebase文档中阅读: https://firebase.google.com/docs/database/android/offline-capabilities

1
如果应用程序处于离线状态,并且存在未处理的事务,则文档中的此部分说明在应用程序重新启动时数据将会丢失。因此,尽管我们获得了离线优势,但仍需手动处理未提交的离线事务吗?https://firebase.google.com/docs/database/android/offline-capabilities#section-handling-transactions-offline - angryITguy
1
@giulio 这是正确的。你可以通过使用典型的数据提交方式来解决这个问题,但是添加一个 Node.JS 函数来观察该值何时被更改,并做出相应的反应。例如,您可以使用 Node.JS 函数来观察实时数据库中何时添加了新消息,然后向对象添加一个“DateUploaded”日期,这可能会触发客户端应用程序中的观察器以重新加载该对象或一组消息。 - Chris Conway

3

摘自这里

不确定这是否与此处相关。但是在另一种情况下,会出现这种崩溃。

如果您的应用程序具有服务(使用不同进程),并且您正在创建自己的Application类,则服务和前台应用程序将使用相同的Application类(而不是相同的实例)进行初始化。现在,当我使用com.google.firebase:firebase-crash依赖项来处理崩溃时,它会创建一个名为your.app.packagename:background_crash的后台服务。由于某种原因,这会导致我的应用程序崩溃。具体地说,是因为在我的Application类中,我进行了如下调用:

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

我猜测,在我们的Application类初始化后台服务时,Firebase没有被正确初始化。为了解决这个问题,我做了以下操作:

if (!FirebaseApp.getApps(this).isEmpty())
        FirebaseDatabase.getInstance().setPersistenceEnabled(true);

0

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

只需将上述代码粘贴到你的第一个活动或启动器活动中,在 set content view 后的 onCreate 方法中即可。对我来说,它完美地运行。


嘿,谢谢你的回答!不过,你可以做得更好一些,就是添加一些关于这个解决方案为什么/如何有效的信息。 - Jake

0
如果有任何iOS开发人员遇到同样的问题,那么在“application:didFinishLaunchingWithOptions”函数中的return语句之前,在您的AppDelegate.swift文件中编写以下行:
FirebaseDatabase.getInstance().setPersistenceEnabled(true); 

并使用以下行

DatabaseReference.keppSynced(true);

在你的视图控制器中使用你的数据库引用。


0
创建一个名为MyAppOFFLINE的Java类,并在您的清单文件中注册此类。
public class MyAppOFFLINE extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        FirebaseDatabase.getInstance().setPersistenceEnabled(true);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接