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();
次のようなもの(iirc):
if (mDatabase == null) {
FirebaseDatabase database = FirebaseDatabase.getInstance();
database.setPersistenceEnabled(true);
mDatabase = database.getReference();
// ...
}
Firebaseのドキュメントによると、setPersistenceEnabledは(FirebaseDatabaseの他のインスタンスが作成される前に)1回だけ呼び出されます。
私にとってこの問題の解決策は次のとおりでした
例えば
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を使用しないでください。
アプリケーション全体で使用されるアプリケーションクラスを作成し、その中の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);
ディスク永続性の詳細ここ
このソリューションは、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);
}
これをアクティビティクラスの先頭に追加するだけです。
static {
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
それがベストプラクティスであるかどうかはわかりませんが、私のために働きました。
アプリでContentProvider
を拡張すると、ContentProvider
のFirebaseDatabase.getInstance().setPersistenceEnabled(true);
メソッドでonCreate()
を呼び出すことができます。このメソッドはonCreate()
ランチャーアクティビティの方法。これは、アプリでTaskStackBuilder
を使用してアクティビティの合成スタックを作成し、一部のアクティビティをスキップして、アプリ通知で使用するときのように前進するときにも役立ちます。そのため、ランチャーアクティビティに戻って戻ると、アプリケーションのどこかでFirebaseDatabase
インスタンスを既に使用している可能性があり、この場合もエラーが表示されます。
setPersistenceEnabled.
を呼び出す前に、初期化されたFirebaseアプリがあるかどうかを確認してみてください。
if (FirebaseApp.getApps(this).size() == 0)
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
Kotlinを使用している場合、次のコードが役に立ちました。クラスの先頭でプライベートメンバー変数として宣言しました。
private val firebaseInstance = FirebaseDatabase.getInstance().apply { setPersistenceEnabled(true) }