com.google.firebase.database.DatabaseException:必须在对 FirebaseDatabase 实例进行任何其他使用之前调用 setPersistenceEnabled()
com.google.firebase.database.DatabaseException: Calls to setPersistenceEnabled() must be made before any other usage of FirebaseDatabase instance
我在 fIREBASE 中尝试设置 Persistence 时遇到问题,有人可以解释一下如何解决吗,
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):
if (mDatabase == null) {
FirebaseDatabase database = FirebaseDatabase.getInstance();
database.setPersistenceEnabled(true);
mDatabase = database.getReference();
// ...
}
根据 Firebase 文档 setPersistenceEnabled 仅被调用一次(在创建任何其他 FirebaseDatabase 实例之前)
所以对我来说这个问题的解决方案如下
- 您需要创建一个 class 来 扩展 android.app.Application 和 setPersistenceEnabled( true) 那边.
例如
class MyFirebaseApp extends android.app.Application
@Override
public void onCreate() {
super.onCreate();
/* Enable disk persistence */
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
- 在Manifest, link MyFirebaseApp class 应用标签
例如
在您的应用程序标签中添加以下内容
android:name="com.example.MyFirebaseApp"
这应该可以正常工作。
也不要在任何其他 Activity.
中使用 setPersistenceEnabled
只需将此添加到您的 activity class:
的顶部
static {
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
对我有用,但不确定这是否是最佳做法。
如果您在应用中扩展 ContentProvider
,您可以调用 FirebaseDatabase.getInstance().setPersistenceEnabled(true);
在你的 ContentProvider
的 onCreate()
方法中,因为这个方法甚至在你的启动器 activity 的 onCreate()
方法之前被调用。当您在应用程序中使用 TaskStackBuilder
创建活动的合成堆栈以跳过某些活动并继续前进时,这也很有用,就像您在应用程序通知中使用时一样。因此,当您返回到启动器 activity 向后移动时,您可能已经在应用程序中的某处使用了 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);
}
创建一个将在整个应用程序中使用的应用程序 class 并在其中初始化 firebase Persistence:
Class 应该扩展应用程序。( ClassName 扩展 Application):
这是一个例子:
FirebaseHandler class
你可以call/name给class任何你想给它起的名字
public class FirebaseHandler extends Application {
@Override
public void onCreate() {
super.onCreate();
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
}
将应用程序 class 添加到您的 Manifest:
<application
android:name=".FirebaseHandler"
android:allowBackup="true"
android:icon="@mipmap/app_icon"
android:label="@string/app_name"
android:theme="@style/AppTheme">
这样数据持久性将应用于您的整个项目。
为了将磁盘持久性应用于特定数据。
DatabaseReference myRef=FirebaseDatabase.getInstance().getReference("people");
myRef.keepSynced(true);
这将使您的离线数据保持同步并保持最新
myRef.keepSynced(true);
了解有关磁盘持久性的更多信息 Here
您可以尝试在调用 setPersistenceEnabled.
之前检查是否有任何已初始化的 firebase 应用程序
if (FirebaseApp.getApps(this).size() == 0)
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
如果您使用的是 Kotlin,则以下代码对我有用。我在 class.
的顶部声明为私有成员变量
private val firebaseInstance = FirebaseDatabase.getInstance().apply { setPersistenceEnabled(true) }
这对我有用。将此添加到您的 launching activity!
try {
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
} catch (Exception e) {}
我在 fIREBASE 中尝试设置 Persistence 时遇到问题,有人可以解释一下如何解决吗,
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):
if (mDatabase == null) {
FirebaseDatabase database = FirebaseDatabase.getInstance();
database.setPersistenceEnabled(true);
mDatabase = database.getReference();
// ...
}
根据 Firebase 文档 setPersistenceEnabled 仅被调用一次(在创建任何其他 FirebaseDatabase 实例之前)
所以对我来说这个问题的解决方案如下
- 您需要创建一个 class 来 扩展 android.app.Application 和 setPersistenceEnabled( true) 那边.
例如
class MyFirebaseApp extends android.app.Application
@Override
public void onCreate() {
super.onCreate();
/* Enable disk persistence */
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
- 在Manifest, link MyFirebaseApp class 应用标签
例如
在您的应用程序标签中添加以下内容
android:name="com.example.MyFirebaseApp"
这应该可以正常工作。
也不要在任何其他 Activity.
中使用 setPersistenceEnabled只需将此添加到您的 activity class:
的顶部static {
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
对我有用,但不确定这是否是最佳做法。
如果您在应用中扩展 ContentProvider
,您可以调用 FirebaseDatabase.getInstance().setPersistenceEnabled(true);
在你的 ContentProvider
的 onCreate()
方法中,因为这个方法甚至在你的启动器 activity 的 onCreate()
方法之前被调用。当您在应用程序中使用 TaskStackBuilder
创建活动的合成堆栈以跳过某些活动并继续前进时,这也很有用,就像您在应用程序通知中使用时一样。因此,当您返回到启动器 activity 向后移动时,您可能已经在应用程序中的某处使用了 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);
}
创建一个将在整个应用程序中使用的应用程序 class 并在其中初始化 firebase Persistence: Class 应该扩展应用程序。( ClassName 扩展 Application):
这是一个例子:
FirebaseHandler class
你可以call/name给class任何你想给它起的名字
public class FirebaseHandler extends Application {
@Override
public void onCreate() {
super.onCreate();
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
}
将应用程序 class 添加到您的 Manifest:
<application
android:name=".FirebaseHandler"
android:allowBackup="true"
android:icon="@mipmap/app_icon"
android:label="@string/app_name"
android:theme="@style/AppTheme">
这样数据持久性将应用于您的整个项目。 为了将磁盘持久性应用于特定数据。
DatabaseReference myRef=FirebaseDatabase.getInstance().getReference("people");
myRef.keepSynced(true);
这将使您的离线数据保持同步并保持最新
myRef.keepSynced(true);
了解有关磁盘持久性的更多信息 Here
您可以尝试在调用 setPersistenceEnabled.
if (FirebaseApp.getApps(this).size() == 0)
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
如果您使用的是 Kotlin,则以下代码对我有用。我在 class.
的顶部声明为私有成员变量private val firebaseInstance = FirebaseDatabase.getInstance().apply { setPersistenceEnabled(true) }
这对我有用。将此添加到您的 launching activity!
try {
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
} catch (Exception e) {}