提问人:Vincent Macharia 提问时间:6/11/2016 更新时间:9/28/2021 访问量:19070
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中设置持久性时遇到了问题,有人可以解释一下如何去做吗,
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 实例之前)
因此,对我来说,这个问题的解决方案如下
- 您需要创建一个类,该类将 android.app.Application 和 setPersistenceEnabled(true) 扩展到那里。
例如
class MyFirebaseApp extends android.app.Application
@Override
public void onCreate() {
super.onCreate();
/* Enable disk persistence */
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
- 在清单中,将 MyFirebaseApp 类链接到应用程序标记
例如
在应用程序标记中,添加以下内容
android:name="com.example.MyFirebaseApp"
这应该可以正常工作。
此外,不要在任何其他活动中使用 setPersistenceEnabled。
评论
android:name
只需在活动类的顶部添加以下内容:
static {
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
对我有用,但不确定这是否是最佳实践。
评论
如果你在你的应用中扩展了 a,你可以调用你的 方法,因为这个方法甚至在启动器活动的方法之前被调用。当您在应用中使用创建活动的合成堆栈以跳过某些活动并继续前进时,这也很有用,就像在应用通知中使用时一样。因此,当您回到向后移动的启动器活动时,您可能已经在应用程序中的某个地方使用了实例,并且在这种情况下您收到的错误也可能弹出。ContentProvider
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 Persistence: 该类应扩展 Application。( ClassName 扩展应用程序):
下面是一个例子:
FirebaseHandler 类
您可以调用/命名任何您想要命名的类
public class FirebaseHandler extends Application {
@Override
public void onCreate() {
super.onCreate();
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
}
将应用程序类添加到清单中:
<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);
在调用之前,您可以尝试检查是否有任何已初始化的 firebase 应用setPersistenceEnabled.
if (FirebaseApp.getApps(this).size() == 0)
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
评论
如果您使用的是 Kotlin,以下代码对我有用。我在类的顶部声明为私有成员变量。
private val firebaseInstance = FirebaseDatabase.getInstance().apply { setPersistenceEnabled(true) }
这对我有用。将其添加到您的启动活动中!
try {
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
} catch (Exception e) {}
评论
savedInstanceState == null