Android com.google.firebase.database.DatabaseException:在其他任何使用FirebaseDatabase实例之前,必须先调用setPersistenceEnabled()
当我试图在fIREBASE中设置Persistence时,我遇到了一个问题,请有人解释一下如何设置PersistenceAndroid com.google.firebase.database.DatabaseException:在其他任何使用FirebaseDatabase实例之前,必须先调用setPersistenceEnabled(),android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,当我试图在fIREBASE中设置Persistence时,我遇到了一个问题,请有人解释一下如何设置Persistence protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_meal_details); if (mDatabase == null) {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_meal_details);
if (mDatabase == null) {
mDatabase = FirebaseDatabase.getInstance().getReference();
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
// ...
}
// FirebaseDatabase.getInstance().setPersistenceEnabled(true);
mDatabase = FirebaseDatabase.getInstance().getReference();
类似这样的内容(iirc):
根据Firebase文档,setPersistenceEnabled只能调用一次(在创建Firebase数据库的任何其他实例之前)
因此,对我来说,这个问题的解决方案如下
class MyFirebaseApp extends android.app.Application
@Override
public void onCreate() {
super.onCreate();
/* Enable disk persistence */
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
class MyFirebaseApp extends android.app.Application
@Override
public void onCreate() {
super.onCreate();
/* Enable disk persistence */
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
在应用程序标记中添加以下内容
android:name="com.example.MyFirebaseApp"
这应该行得通
也不要在任何其他活动中使用setPersistenceEnabled。只需在活动类的顶部添加以下内容:
static {
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
为我工作,但不确定这是否是最佳实践。如果在应用程序中扩展
内容提供者
,则可以调用FirebaseDatabase.getInstance().setPersistenceEnabled(true)代码>
在ContentProvider
的onCreate()
方法中,因为此方法甚至在启动程序活动的onCreate()
方法之前被调用。当您在应用程序中使用TaskStackBuilder
创建活动的合成堆栈以跳过某些活动并向前移动时(如使用应用程序内通知时),这也很有用。因此,当您返回到向后移动的启动器活动时,您可能已经在应用程序中的某个位置使用了FirebaseDatabase
实例,并且在这种情况下可能会弹出错误。此解决方案适用于我,但不扩展android.app.application
private static FirebaseDatabase firebaseDatabase;
if (firebaseDatabase == null) {
firebaseDatabase=FirebaseDatabase.getInstance();
firebaseDatabase.setPersistenceEnabled(true);
}
/* Do your other stuff */
或
if (savedInstanceState == null) {
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
创建将在整个应用程序中使用的应用程序类,并在其中初始化firebase持久性:
FirebaseHandler类
您可以调用/命名该类,无论您想命名它什么
将应用程序类添加到清单中:
<application
android:name=".FirebaseHandler"
android:allowBackup="true"
android:icon="@mipmap/app_icon"
android:label="@string/app_name"
android:theme="@style/AppTheme">
这将使您的脱机数据保持同步并保持最新状态
myRef.keepSynced(true);
了解有关磁盘持久性的更多信息在调用setPersistenceEnabled之前,您可以尝试检查是否有任何初始化的firebase应用程序。
if (FirebaseApp.getApps(this).size() == 0)
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
如果您使用的是Kotlin,那么下面的代码适用于我。我在类的顶部声明为私有成员变量
private val firebaseInstance = FirebaseDatabase.getInstance().apply { setPersistenceEnabled(true) }
除了Frank的回答之外,您还应该添加一个检查,例如savedInstanceState==null
,以确保在活动重新启动时不会再次执行该语句。否则,旋转设备时会出现异常。我尝试了此操作,反复出现以下异常致命异常:主进程:co.transportsystems.offrie:background\u crash,PID:27025 java.lang.RuntimeException:无法创建应用程序com.android.tools.fd.runtime.bootstrap应用程序:java.lang.IllegalStateException:名为[DEFAULT]的FirebaseApp不存在。你知道为什么会这样吗?这对我很有用。。。Thanx siddhesh+1从我这边。除此之外,如果您已经在应用程序标签上为另一个应用程序类使用了android:name
,并且您无法更改它(就像使用MultiDexApplication来配置应用程序,使用超过64K的方法一样)你可以让MyFirebaseApp扩展这个类。这对我来说很有效,而且似乎是一条出路。谢谢firebase团队对此问题是否有最佳做法?我看到你对这个问题给出了2到3个不同的答案。你能给我们指出一个最佳实践吗?由于某种原因,刚刚再次使用它,所以使用它的风险由你自己承担。
if (FirebaseApp.getApps(this).size() == 0)
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
private val firebaseInstance = FirebaseDatabase.getInstance().apply { setPersistenceEnabled(true) }