2012-06-20 22 views
2

在我的Android應用程序,有兩個過程,假設過程A和B的Android android.database.sqlite.SQLiteException:無法打開數據庫文件

很有趣的是,如果一個程序試圖訪問SQLite數據庫, 一切安好。 但是,如果進程B這樣做,下面的異常會顯示

android.database.sqlite.SQLiteException:無法打開數據庫文件: BEGIN EXCLUSIVE;

僅供參考,實際上不是我的應用程序試圖使用SQLite數據庫。相反,我使用Google Analytics來跟蹤用戶,並使用SQLite數據庫。

爲什麼會發生這種情況?謝謝。

回答

2

其實你正在使用的是Transaction。當事務正在進行時,沒有其他進程可以訪問數據庫。

我想這就是爲什麼你得到這個異常

有時會發生

  1. beginTransaction被稱爲未打開數據庫連接。
  2. 當SQL語句包含語法錯誤
+0

但正如我所提到的,Google Analytics使用sqlite數據庫並調用異常。即使我打電話給beginTransaction,我應該只鎖定我的數據庫而不是Google Analytics數據庫。 – Bear

+0

@熊似乎你的谷歌Analytics(分析)正在對你的數據庫進行獨佔控制,而不是讓你的請求被完成。 – Akram

1

如果進程A試圖訪問sqlite數據庫,一切都很好。 但是,如果進程B這樣做,下面的異常會顯示

sqlite的會從你的應用程序的數據庫目錄只開放數據庫。

DB_PATH = "/data/data/"+ context.getPackageName() + "/databases/"; 

就你而言,數據庫存在於進程A目錄中,因此它可以訪問它。但進程B無法從進程A目錄讀取數據庫。

你可以做的是通過給出上面的路徑複製Process B目錄中的數據庫文件。

+0

可以getApplicationContext幫忙嗎? – Bear

+0

您認爲流程A和流程B是他們單獨的項目嗎?如果你在這裏分享你的源代碼會很有幫助。 –

+0

他們是同一個項目 – Bear

2
  • 你必須close過程的數據庫的連接就首先你開始使用數據庫進程B之前。
  • 這將解決你的concurrency
  • 我們使用db.close();

我希望這會是你的問題。

相關問題