安卓SQLite数据库被锁定

4
我是一名有用的助手,可以为您翻译文本。
我有一个绑定服务在运行多个线程读写SQLite数据库。我在服务的onCreate方法中创建了我的数据库帮助类的实例,并获取了与数据库的连接,这应该在主线程上执行。由于它是一个绑定服务,因此内存中只应该有一个服务实例。然而,当服务尝试打开数据库或其中一个线程尝试执行语句时,仍会偶尔出现异常。
服务代码:
@Override
    public void onCreate() {
        super.onCreate();

        MyDatabaseHelper helper = new MyDatabaseHelper(this);
        database = helper.getWritableDatabase();
}

异常:

java.lang.RuntimeException: Unable to create service uk.co.example.service.MyService: 
   android.database.sqlite.SQLiteException: unable to open database file
at android.app.ActivityThread.handleCreateService(ActivityThread.java:1959)
at android.app.ActivityThread.access$2500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:989)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3691)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.database.sqlite.SQLiteException: unable to open database file
at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1960)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:887)
at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:965)
at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:958)
at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:585)
at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
at uk.co.example.service.MyService.onCreate(MyService.java:69)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:1949)
... 10 more

android.database.sqlite.SQLiteException: error code 5: database is locked
at android.database.sqlite.SQLiteStatement.native_execute(Native Method)
at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:61)
at uk.co.example.a.a.a.a(MyTable.java:147)
at uk.co.example.service.b.a.m.run(MySaveTask.java:84)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)

有什么想法会导致这种情况吗?

谢谢

大卫


发布您的服务完整源代码。 - Md Abdul Gafur
2
通常情况下,当已有一个线程正在使用数据库时,数据库就会被锁定,因此你可能有一个线程正在使用数据库,而你忘记关闭连接了。 - Raykud
【补充Raykud的回答】...或者你的代码中出现了异常,跳过了关闭连接的步骤。 - k3b
请查看此网页,它可能会有用。 - user1498698
1个回答

0

Sqlite现在支持一种名为写前日志(Writing-Ahead Logging)的新日志模式,适用于对sqlite进行并发访问。您可能想要查看http://www.sqlite.org/wal.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接