web-dev-qa-db-ja.com

com.google.firebase.database.DatabaseException:setPersistenceEnabled()の呼び出しは、FirebaseDatabaseインスタンスの他の使用の前に行う必要があります

FIREBASEでsetPersistenceを設定しようとすると問題が発生します。その解決方法について誰か説明してください。

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();
27

次のようなもの(iirc):

 if (mDatabase == null) {
     FirebaseDatabase database = FirebaseDatabase.getInstance();
     database.setPersistenceEnabled(true);
     mDatabase = database.getReference();
     // ...
 }
17

Firebaseのドキュメントによると、setPersistenceEnabledは(FirebaseDatabaseの他のインスタンスが作成される前に)1回だけ呼び出されます。

私にとってこの問題の解決策は次のとおりでした

  1. そこにclass which Android.app.Applicationを拡張およびsetPersistenceEnabled(true)を作成する必要があります。

例えば

class MyFirebaseApp extends Android.app.Application 

@Override
public void onCreate() {
    super.onCreate();
    /* Enable disk persistence  */
    FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
  1. マニフェストで、MyFirebaseAppクラスをアプリケーションタグにリンクします

例えば

アプリケーションタグに以下を追加します

Android:name="com.example.MyFirebaseApp"

これでうまくいくはずです。

また、他のアクティビティでsetPersistenceEnabledを使用しないでください。

85
Siddhesh Dighe

アプリケーション全体で使用されるアプリケーションクラスを作成し、その中のfirebase Persistenceを初期化します。

FirebaseHandler classクラスに名前を付けたいものは何でも呼び出すことができます

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

アプリケーションクラスを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);

ディスク永続性の詳細ここ

9
RileyManda

このソリューションは、Android.app.Applicationを拡張しなくても機能します

private static FirebaseDatabase firebaseDatabase;

    if (firebaseDatabase == null) {
        firebaseDatabase=FirebaseDatabase.getInstance();
        firebaseDatabase.setPersistenceEnabled(true);
    }
    /* Do your other stuff  */

[〜#〜] or [〜#〜]

if (savedInstanceState == null) {
   FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
6
Vishal G. Gohel

これをアクティビティクラスの先頭に追加するだけです。

static {
    FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}

それがベストプラクティスであるかどうかはわかりませんが、私のために働きました。

5
zarsky

アプリでContentProviderを拡張すると、ContentProviderFirebaseDatabase.getInstance().setPersistenceEnabled(true);メソッドでonCreate()を呼び出すことができます。このメソッドはonCreate()ランチャーアクティビティの方法。これは、アプリでTaskStackBuilderを使用してアクティビティの合成スタックを作成し、一部のアクティビティをスキップして、アプリ通知で使用するときのように前進するときにも役立ちます。そのため、ランチャーアクティビティに戻って戻ると、アプリケーションのどこかでFirebaseDatabaseインスタンスを既に使用している可能性があり、この場合もエラーが表示されます。

3
Kartik Watwani

setPersistenceEnabled.を呼び出す前に、初期化されたFirebaseアプリがあるかどうかを確認してみてください。

if (FirebaseApp.getApps(this).size() == 0)
    FirebaseDatabase.getInstance().setPersistenceEnabled(true);
0
Isaac Sekamatte

Kotlinを使用している場合、次のコードが役に立ちました。クラスの先頭でプライベートメンバー変数として宣言しました。

private val firebaseInstance = FirebaseDatabase.getInstance().apply { setPersistenceEnabled(true) }
0
Bellan