VACUUM приводит к "Невозможно открыть файл базы данных"
Я получаю следующую ошибку в Spatialite, когда пытаюсь добавить новые файлы в свою базу данных.
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)
Этот код запускается в отдельном потоке из потока пользовательского интерфейса и выполняет следующий код со строкой 153, отмеченной из GeoDataHelper.addDb.
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 ответ
Когда я писал ответ на этот вопрос, я понял одну важную вещь. VACUUM
зависит от наличия временного каталога. Код, который я нашел в сети, использует временный каталог, но не тот, который является каталогом кеша. Изменение кода для этого решило проблему:
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()});