android - VACUUM 结果为 "Unable to open database file"

标签 android sql sqlite spatialite jsqlite

当我尝试将新文件添加到我的数据库时,我在 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)

此代码在与 UI 线程不同的线程中运行,并执行以下代码,第 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);

我不明白前两个调用为何有效,但 VACUUM 无效。有什么想法吗?

最佳答案

在我写这个问题的答案时,我意识到一件重要的事情。 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()});

关于android - VACUUM 结果为 "Unable to open database file",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26202434/

相关文章:

android - 在 adb install 上安装 INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES

android - 我如何更改我的安卓游戏的图片/徽章? - libGDX

sql - 比较 PostgreSQL 中两个逗号分隔的列

MYSQL:选择与同一集合生成的条件匹配的集合

c# - SQLiteDataAdapter 更新方法返回 0

iphone - 试图在 iPhone 应用程序更新中覆盖 sqlite 数据库

java - NoSuchMethodError : android. support.v4.view.ViewCompat.isAttachedToWindow

android - 我们可以将 gson 模型与 realm 一起使用吗?当我尝试时它显示构建时间错误

sql - 更新触发器仅在数据更改时更新

ios - 如何获取存储在sqlite数据库中的浮点值?