1

データベースに新しいファイルを追加しようとすると、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 スレッドとは別のスレッドで実行され、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);

最初の 2 つの呼び出しが有効である理由がわかりませんが、VACUUM は有効ではありません。何か案は?

4

1 に答える 1

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()});
于 2014-10-05T12:07:24.937 に答える