无法使用离线地图的 Cordova sqlite 插件将 BLOB 转换为字符串
Unable to convert BLOB to String with Cordova sqlite plugin for offline maps
我正在学习本教程:https://kuamoto.wordpress.com/2016/02/26/myth-1-cant-make-offline-apps/ to get offline maps in an ionic 2 app based on a sqlite database (.mbtiles). I use Cordova Sqlite plugin to query the database as shown in this repo : https://github.com/wilblack/offline-map-example
数据库包含与 x、y 和 z 的组合对应的 Blob,这是我要显示的地图位置。
我已成功打开数据库并对其进行查询,但我遇到了以下错误:
unknown error (Sqlite code 0): Unable to convert BLOB to string, (OS error - 2:No such file or directory)"
这似乎是一个普遍的问题,但我只直接找到了 Android 的解决方案。这是我的打字稿代码:
getTileUrl: function(tilePoint, zoom, tile) {
var z = this._getZoomForUrl();
z = Math.round(z);
var x = tilePoint.x;
var y = tilePoint.y;
y = Math.pow(2, z) - y - 1;
var base64Prefix = 'data:image/gif;base64,';
this.mbTilesDB.transaction((tx) => {
tx.executeSql("SELECT tile_data FROM tiles WHERE zoom_level = ? AND tile_column = ? AND tile_row = ?;", [z, x, y], (tx, res) => {
//Never get here
tile.src = base64Prefix + res.rows.item(0).tile_data;
}, (err, msg) => {
console.log('[MapPage.getTileUrl] error with executeSql', err);
});
}, (err, msg) => {
console.log("[MapPage.getTileUrl] Transaction err:", err);
});
},
_loadTile: function(tile, tilePoint, zoom) {
tile._layer = this;
tile.onload = this._tileOnLoad;
tile.onerror = this._tileOnError;
this.getTileUrl(tilePoint, zoom, tile);
}
代码在启动查询后立即中断。如果我在数据库浏览器中启动查询,我将获得一个 Blob 形式的结果。
这个问题已关闭:How to set tile_data from .mbtiles file as tiles for leaflet? 除了我什至没有从查询中得到结果
感谢您的帮助
据我所知,大多数 JavaScript 实现不支持 blob。
该代码假定数据库中的数据存储为 Base64 编码文本(或者数据库驱动程序自动执行此转换)。
您必须告诉数据库将 blob 转换为某种文本格式 (SELECT hex(tile_data) ...
),然后在您的代码中将该十六进制字符串转换为某种有用的格式。
Cordova-sqlite-ext 支持从预填充的 sqlite 数据库(如 .mbtiles-files)读取 BLOB。
为了构建包含图块数据的数据 URL,您可以改编以下取自 README 的代码:
```
db.readTransaction(function(tx) {
tx.executeSql("SELECT BASE64(data) AS base64_data FROM MyTable", [], function(tx, resultSet) {
console.log('BLOB data (base64): ' + resultSet.rows.item(0).base64_data);
});
});
```
我正在学习本教程:https://kuamoto.wordpress.com/2016/02/26/myth-1-cant-make-offline-apps/ to get offline maps in an ionic 2 app based on a sqlite database (.mbtiles). I use Cordova Sqlite plugin to query the database as shown in this repo : https://github.com/wilblack/offline-map-example
数据库包含与 x、y 和 z 的组合对应的 Blob,这是我要显示的地图位置。
我已成功打开数据库并对其进行查询,但我遇到了以下错误:
unknown error (Sqlite code 0): Unable to convert BLOB to string, (OS error - 2:No such file or directory)"
这似乎是一个普遍的问题,但我只直接找到了 Android 的解决方案。这是我的打字稿代码:
getTileUrl: function(tilePoint, zoom, tile) {
var z = this._getZoomForUrl();
z = Math.round(z);
var x = tilePoint.x;
var y = tilePoint.y;
y = Math.pow(2, z) - y - 1;
var base64Prefix = 'data:image/gif;base64,';
this.mbTilesDB.transaction((tx) => {
tx.executeSql("SELECT tile_data FROM tiles WHERE zoom_level = ? AND tile_column = ? AND tile_row = ?;", [z, x, y], (tx, res) => {
//Never get here
tile.src = base64Prefix + res.rows.item(0).tile_data;
}, (err, msg) => {
console.log('[MapPage.getTileUrl] error with executeSql', err);
});
}, (err, msg) => {
console.log("[MapPage.getTileUrl] Transaction err:", err);
});
},
_loadTile: function(tile, tilePoint, zoom) {
tile._layer = this;
tile.onload = this._tileOnLoad;
tile.onerror = this._tileOnError;
this.getTileUrl(tilePoint, zoom, tile);
}
代码在启动查询后立即中断。如果我在数据库浏览器中启动查询,我将获得一个 Blob 形式的结果。
这个问题已关闭:How to set tile_data from .mbtiles file as tiles for leaflet? 除了我什至没有从查询中得到结果
感谢您的帮助
据我所知,大多数 JavaScript 实现不支持 blob。
该代码假定数据库中的数据存储为 Base64 编码文本(或者数据库驱动程序自动执行此转换)。
您必须告诉数据库将 blob 转换为某种文本格式 (SELECT hex(tile_data) ...
),然后在您的代码中将该十六进制字符串转换为某种有用的格式。
Cordova-sqlite-ext 支持从预填充的 sqlite 数据库(如 .mbtiles-files)读取 BLOB。
为了构建包含图块数据的数据 URL,您可以改编以下取自 README 的代码:
```
db.readTransaction(function(tx) {
tx.executeSql("SELECT BASE64(data) AS base64_data FROM MyTable", [], function(tx, resultSet) {
console.log('BLOB data (base64): ' + resultSet.rows.item(0).base64_data);
});
});
```