2017-08-12 242 views
9

我越来越对少数设备此崩溃,但仅适用于Android 4火力地堡数据库崩溃SQLiteDatabaseLockedException

我在火力地堡的Android SDK 10.2.1 11.0.2。推迟更新到最新版本,因为它也会强制更新Google Play服务,并且许多用户仍然保留旧版GPS版本。

是否有人看到这个问题?

更新:这是工作更早。崩溃开始,我从火力地堡SDK 9.4.0升级到10.2.1之后,并compileSdkVersion 23至25只崩溃发生在Android 4.4(奇巧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) 

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

启用'multidex' –

+0

@IntelliJAmiya你能解释一下为什么multidex是这里的问题?这次崩溃对我来说是不可重复的,我唯一的选择是在生产中进行测试。 –

回答

4

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

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

编辑:有了您的详细堆栈跟踪信息的新的编辑,我看到的是什么错误。当您设置setPersistenceEnabled(true)时,发生错误。这个必须在你做任何其他的事情之前完成,你的firebaseDatabase对象。所以,我recomand您使用下面的代码:

public class HelperClass { 
    private static FirebaseDatabase firebaseDatabase; 
    public static FirebaseDatabase getDatabase() { 
     if (firebaseDatabase == null) { 
      firebaseDatabase = FirebaseDatabase.getInstance(); 
      firebaseDatabase.setPersistenceEnabled(true); 
     } 
     return firebaseDatabase; 
    } 
} 
+0

该崩溃确实来自Firebase数据库。得到了更详细的堆栈跟踪,在我的问题中更新。 –

+0

请看我更新的答案。 –

+0

现在我知道这是一个确认的Firebase数据库问题,我有更多的线索。这是一段代码,当我从Firebase SDK 9.4.0升级到10.2.1后,崩溃开始了。将Firebase升级到11.0.2后继续崩溃。 Google Play服务现在也在11.0.2。 –