2012-08-13 44 views
3

我得到一个SQLiteException,说数据库被锁定来自webview。我实际上并没有在我的应用程序中使用任何Web浏览器,但我相信它与基于this other stack overflow question的admob相关,这是没有答案的。Webview SQLiteException:数据库被锁定

我使用SQLite为我自己的东西,但这不应该导致它应该吗? 我似乎无法复制它,所以我不知道如何解决它。有任何想法吗?

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 android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1916) 
at android.webkit.WebViewDatabase.flushCacheStat(WebViewDatabase.java:874) 
at android.webkit.CacheManager.trimCacheIfNeeded(CacheManager.java:566) 
at android.webkit.WebViewWorker.handleMessage(WebViewWorker.java:193) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:143) 
at android.os.HandlerThread.run(HandlerThread.java:60) 

回答

1

尝试修改StrictMode以查看有关错误的更多信息。它可能与主线程上的Internet访问,并发问题以及很多问题有关,因此请尝试发布清单以查看和建议您,因为此堆栈跟踪没有提供如此多的信息。并记住修改StrictMode并发布消息。

1

总结:超过1连接

描述:您需要使数据库连接的单个实例(共用的实例)。我能想到的是;当你有超过2个数据库连接打开时(甚至是相同的sqlite数据库),这种类型的错误通常会出现。所以确保你只有一个连接活动,最简单的方法就是在整个应用程序中创建你的数据库实例单例和共享,并且这样(共享)你将只有一个连接将你连接到数据库。

1

当多个线程同时更新数据库时会发生这种情况。您可以通过向代码中添加syncronized块来避免此情况。

synchronized (this) { 
     //update your database (one thread at time) 
    } 
3

您是否使用多个进程?我的意思是你的活动是从不同的过程开始的? 如果是,它可能会导致问题,因为webview使用单身管理数据库管理。

+1

是的,实际上,我有两个MapViews在不同的进程中,现在不记得为什么了,但是在不同的活动中使用地图视图时遇到了一些问题,并将它们放在不同的进程中。 – Jack 2012-08-22 16:10:07

+0

对不起,但现在我不知道如何解决这个问题。也许只能在一项活动中使用adview,但我知道这不是一个解决方案。 – hsafarya 2012-08-22 16:23:59