Firebase数据库崩溃SQLiteDatabaseLockedException

我在几台设备上遇到这个崩溃,但只在Android 4上。

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

有人看到这个问题吗?

更新:这是更早的工作。 从Firebase SDK 9.4.0升级到10.2.1,以及将SdkVersion 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 (ie 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) 

我在应用程序中有多个进程,但使用以下代码来中止subprocess的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); } 

Solutions Collecting From Web of "Firebase数据库崩溃SQLiteDatabaseLockedException"

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

如果语句是[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; } }