Android SQLite数据库已锁定

Android SQLite数据库已锁定,android,sqlite,Android,Sqlite,我有一个绑定服务,它运行多个线程,可以读写SQLite数据库。我创建了数据库助手的一个实例,并在我的服务的onCreate中获得到数据库的连接,该连接应该在主线程上执行。因为它是绑定服务,所以内存中应该只有一个服务实例。然而我仍然得到 当服务尝试打开数据库或其中一个线程尝试执行语句时,偶尔会出现异常 服务代码: @Override public void onCreate() { super.onCreate(); MyDatabaseHelper he

我有一个绑定服务,它运行多个线程,可以读写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)
java.lang.RuntimeException:无法创建服务uk.co.example.service.MyService:
android.database.sqlite.SQLiteException:无法打开数据库文件
位于android.app.ActivityThread.handleCreateService(ActivityThread.java:1959)
在android.app.ActivityThread.access,售价2500美元(ActivityThread.java:117)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:989)上
位于android.os.Handler.dispatchMessage(Handler.java:99)
位于android.os.Looper.loop(Looper.java:123)
位于android.app.ActivityThread.main(ActivityThread.java:3691)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:507)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:847)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
在dalvik.system.NativeStart.main(本机方法)
原因:android.database.sqlite.SQLiteException:无法打开数据库文件
位于android.database.sqlite.SQLiteDatabase.dbopen(本机方法)
位于android.database.sqlite.SQLiteDatabase(SQLiteDatabase.java:1960)
位于android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:887)
位于android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:965)
位于android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:958)
位于android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:585)
位于android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
位于android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
位于uk.co.example.service.MyService.onCreate(MyService.java:69)
位于android.app.ActivityThread.handleCreateService(ActivityThread.java:1949)
... 10多
android.database.sqlite.SQLiteException:错误代码5:数据库已锁定
在android.database.sqlite.SQLiteStatement.native_执行(本机方法)
位于android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:61)
在uk.co.example.a.a.a(MyTable.java:147)
在uk.co.example.service.b.a.m.run(MySaveTask.java:84)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
运行(Thread.java:1019)
你知道这是什么原因吗

谢谢


David

Sqlite现在支持一种新的日志模式,称为write-Ahead-Logging,它适合于并发访问Sqlite。您可能想看一看。

发布您的服务完整源代码。……通常,当已经有一个线程正在使用数据库时,数据库会被锁定,因此可能您的一个线程正在使用数据库,而您忘记了关闭连接。[添加到Raykud答案]。。。或者您的代码中存在跳过近距离连接的异常。请查看,这可能很有用。