Firebase数据库崩溃SQLiteDatabaseLockedException

Niz*_*een 11 android firebase firebase-realtime-database

我在几台设备上遇到了这次崩溃,但仅限于Android 4.

我在Firebase Android SDK 10.2.1 11.0.2上.推迟更新到最新版本,因为它也强制更新Google Play服务,并且许多用户继续保留旧的GPS版本.

有人看到这个问题吗?

更新:这是更早的工作.从Firebase SDK 9.4.0升级到10.2.1后,崩溃开始,并且将compileSdkVersion 23升级到25.崩溃只发生在Android 4.4(Kitkat 19)

更新例外:

Fatal Exception: java.lang.RuntimeException
       at com.google.android.gms.internal.mz.run(Unknown Source)
       at android.os.Handler.handleCallback(Handler.java:808)
       at android.os.Handler.dispatchMessage(Handler.java:103)
       at android.os.Looper.loop(Looper.java:193)
       at android.app.ActivityThread.main(ActivityThread.java:5292)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:515)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
       at dalvik.system.NativeStart.main(NativeStart.java)
Caused by o.kD: Failed to gain exclusive lock to Firebase Database's offline persistence. This generally means you are using Firebase Database from multiple processes in your app. Keep in mind that multi-process Android apps execute the code in your Application class in all processes, so you may need to avoid initializing FirebaseDatabase in your Application class. If you are intentionally using Firebase Database from multiple processes, you can only enable offline persistence (i.e. call setPersistenceEnabled(true)) in one of them.
       at com.google.android.gms.internal.nb.zzN(Unknown Source)
       at com.google.android.gms.internal.nb.(Unknown Source)
       at com.google.android.gms.internal.mx.zza(Unknown Source)
       at com.google.android.gms.internal.qd.zzgQ(Unknown Source)
       at com.google.android.gms.internal.qu.zzHg(Unknown Source)
       at com.google.android.gms.internal.qu.zza(Unknown Source)
       at com.google.android.gms.internal.qv.run(Unknown Source)
       at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
       at java.lang.Thread.run(Thread.java:841)
Caused by android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5): , while compiling: PRAGMA journal_mode
       at android.database.sqlite.SQLiteConnection.nativePrepareStatement(SQLiteConnection.java)
       at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:893)
       at android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:638)
       at android.database.sqlite.SQLiteConnection.setJournalMode(SQLiteConnection.java:320)
       at android.database.sqlite.SQLiteConnection.setWalModeFromConfiguration(SQLiteConnection.java:294)
       at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:215)
       at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)
       at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
       at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
       at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
       at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:829)
       at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:814)
       at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:709)
       at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:1039)
       at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:256)
       at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
       at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
       at com.google.android.gms.internal.nb.zzN(Unknown Source)
       at com.google.android.gms.internal.nb.(Unknown Source)
       at com.google.android.gms.internal.mx.zza(Unknown Source)
       at com.google.android.gms.internal.qd.zzgQ(Unknown Source)
       at com.google.android.gms.internal.qu.zzHg(Unknown Source)
       at com.google.android.gms.internal.qu.zza(Unknown Source)
       at com.google.android.gms.internal.qv.run(Unknown Source)
       at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
       at java.lang.Thread.run(Thread.java:841)
Run Code Online (Sandbox Code Playgroud)

我在应用程序中有多个进程,但使用以下代码中止子进程的Application.onCreate.

@Override
public void onCreate() {
    super.onCreate();

    if (FirebaseApp.getApps(this).isEmpty()) {
        // No firebase apps; we are in a non-main process
        return;
    }

    // Firebase init and other custom logic
    FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*amo 5

Firebase 中没有 SQLiteDatabaseLockedException。当您在 Android 中使用数据库并且数据库引擎无法获取完成其工作所需的数据库锁时,会引发此SQLiteDatabaseLockedException 。SQLite

如果该语句是 [COMMIT] 或发生在显式事务之外,则您可以重试该语句。如果该语句不是 [COMMIT] 并且发生在显式事务中,那么您应该在继续之前回滚该事务。

编辑:通过对详细堆栈跟踪的新编辑,我看到了错误是什么。当你设置的时候出现这个错误setPersistenceEnabled(true)。必须在对对象执行任何其他操作之前完成此操作firebaseDatabase。因此,我建议您使用以下代码:

public class HelperClass {
    private static FirebaseDatabase firebaseDatabase;
    public static FirebaseDatabase getDatabase() {
        if (firebaseDatabase == null) {
            firebaseDatabase = FirebaseDatabase.getInstance();
            firebaseDatabase.setPersistenceEnabled(true);
        }
        return firebaseDatabase;
    }
}
Run Code Online (Sandbox Code Playgroud)