2017-08-12 24 views
9

Tôi nhận được tai nạn này trên vài thiết bị, nhưng chỉ có trên Android 4.căn cứ hỏa lực Cơ sở dữ liệu tai nạn SQLiteDatabaseLockedException

Tôi đang trên căn cứ hỏa lực Android SDK 10.2.1 11.0.2. Trì hoãn việc cập nhật lên phiên bản mới nhất vì nó cũng buộc cập nhật Dịch vụ của Google Play và nhiều người dùng vẫn tiếp tục sử dụng các phiên bản GPS cũ hơn.

Có ai khác đang gặp sự cố này không?

Cập nhật: Điều này đã hoạt động trước đó. Tai nạn bắt đầu sau khi tôi nâng cấp từ SDK căn cứ hỏa lực 9.4.0 để 10.2.1, và compileSdkVersion 23 đến 25. sụp đổ chỉ xảy ra trên Android 4.4 (Kitkat 19)

Cập nhật Ngoại lệ:

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) 

tôi làm có nhiều quy trình trong ứng dụng, nhưng sử dụng mã sau để hủy bỏ Application.onCreate cho các tiến trình con.

@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

Enable 'multidex' –

+0

@IntelliJAmiya bạn có thể giải thích lý do tại sao multidex là vấn đề ở đây? Tai nạn này không thể lặp lại cho tôi, và lựa chọn duy nhất của tôi là thử nghiệm trong sản xuất. –

Trả lời

4

Không có SQLiteDatabaseLockedException trong Firebase. SQLiteDatabaseLockedException này được ném khi bạn đang sử dụng cơ sở dữ liệu SQLite với Android và công cụ cơ sở dữ liệu không thể lấy khóa cơ sở dữ liệu cần thực hiện công việc của mình.

Nếu câu lệnh là [COMMIT] hoặc xảy ra bên ngoài giao dịch rõ ràng thì bạn có thể thử lại tuyên bố. Nếu câu lệnh không phải là [COMMIT] và xảy ra trong một giao dịch rõ ràng thì bạn nên khôi phục giao dịch trước khi tiếp tục.

Chỉnh sửa: Với chỉnh sửa mới của dấu vết ngăn xếp chi tiết, tôi thấy lỗi là gì. Lỗi xảy ra khi bạn đang thiết lập setPersistenceEnabled(true). Điều này phải được thực hiện trước khi làm bất cứ điều gì khác với đối tượng firebaseDatabase của bạn. Vì vậy, tôi recomand bạn sử dụng đoạn mã sau:

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

Tai nạn thực sự đến từ Cơ sở dữ liệu Firebase. Có một dấu vết ngăn xếp chi tiết hơn được cập nhật trong câu hỏi của tôi. –

+0

Vui lòng xem câu trả lời cập nhật của tôi. –

+0

Bây giờ tôi biết đó là một vấn đề cơ sở dữ liệu Firebase đã được xác nhận, tôi có nhiều manh mối hơn. Đây là một đoạn mã hoạt động và các sự cố bắt đầu sau khi tôi nâng cấp từ Firebase SDK 9.4.0 lên 10.2.1. Các sự cố vẫn tiếp tục sau khi nâng cấp Firebase lên 11.0.2. Dịch vụ của Google Play hiện cũng ở mức 11.0.2. –

Các vấn đề liên quan