2014-10-05 69 views
1

當我嘗試將新文件添加到我的數據庫時,出現以下Spatialite錯誤。VACUUM導致「無法打開數據庫文件」

10-05 11:50:01.408: E/GDH(1545): jsqlite.Exception: unable to open database file 
10-05 11:50:01.408: E/GDH(1545): at jsqlite.Database._exec(Native Method) 
10-05 11:50:01.408: E/GDH(1545): at jsqlite.Database.exec(Database.java:177) 
10-05 11:50:01.408: E/GDH(1545): at com.kd7uiy.hamfinder.database.GeoDataHelper.addDb(GeoDataHelper.java:153) 

該代碼在從UI線程的單獨的線程中運行,並且執行下面的代碼,與來自GeoDataHelper.addDb標線153。

Database db = this.getWritableDatabase(); 
TableResult result=new TableResult(); //Filler, isn't really needed, but... 
db.exec("ATTACH DATABASE \"%q\" AS newDb",result,new String[]{path}); 
db.exec("REPLACE INTO counties(name,cntyidfp,geometry) " 
     + "SELECT name,cntyidfp,geometry FROM newDb.counties",result); 
db.exec("VACUUM",result); 
db.exec("DETACH DATABASE newDb",result); 

打開數據庫的代碼包括這樣的:

Database db = new Database(); 
db.open(mDatabasePath + "/" + mName, 
     jsqlite.Constants.SQLITE_OPEN_READWRITE); 
// set parameters 
db.exec("PRAGMA journal_mode = PERSIST;", null); 
db.exec("PRAGMA temp_store = FILE;", null); 
db.exec("PRAGMA temp_store_directory = \"" + mDatabasePath+"/"+mName + "\";", null); 

我不明白,前兩個電話怎麼都有效,但真空不。有任何想法嗎?

+1

注意(http://sqlite.org/pragma.html#pragma_temp_store_directory) – 2014-10-05 18:16:15

回答

1

當我寫這個答案時,我意識到一件重要的事情。 VACUUM取決於有一個臨時目錄可用。我從網上找到的代碼使用一個臨時目錄,但不是正確的那個,它是緩存目錄。更改代碼,這解決了這個問題:[了`temp_store_directory`折舊]

Database db = new Database(); 
db.open(mDatabasePath + "/" + mName, 
     jsqlite.Constants.SQLITE_OPEN_READWRITE); 
// set parameters 
db.exec("PRAGMA journal_mode = PERSIST;", null); 
db.exec("PRAGMA temp_store = FILE;", null); 
db.get_table("PRAGMA temp_store_directory = \"%q\";", new String[]{mContext.getCacheDir().toString()}); 
相關問題