2014-10-05 6 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 = 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); 

내가 처음 두 호출이 유효한 방법을 이해하지 않지만, VACUUM는되지 않습니다 :

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); 

데이터베이스를 엽니 코드는 다음이 포함되어 있습니다. 어떤 아이디어?

+1

주 (http://sqlite.org/pragma.html#pragma_temp_store_directory) –

답변

1

나는 이것에 대한 답을 쓰면서, 나는 중요한 것을 깨달았다. VACUUM은 임시 디렉토리를 사용할 수 있는지 여부에 달려 있습니다. net에서 찾은 코드는 임시 디렉토리를 사용하지만 올바른 디렉토리는 캐시 디렉토리가 아닙니다. 문제이에 코드를 해결 변경 : [.은`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()});