无法使用Cordova sqlite插件将BLOB转换为用于脱机地图的字符串

无法使用Cordova sqlite插件将BLOB转换为用于脱机地图的字符串,sqlite,cordova,leaflet,blob,offline-caching,Sqlite,Cordova,Leaflet,Blob,Offline Caching,我遵循本教程:在基于sqlite数据库(.mbtiles)的ionic 2应用程序中获取脱机地图。我使用Cordova Sqlite插件查询数据库,如本报告所示: 数据库包含对应于x、y和z组合的Blob,这些Blob用于我要显示的地图位置 我已成功打开数据库并进行查询,但遇到以下错误: unknown error (Sqlite code 0): Unable to convert BLOB to string, (OS error - 2:No such file or directory)

我遵循本教程:在基于sqlite数据库(.mbtiles)的ionic 2应用程序中获取脱机地图。我使用Cordova Sqlite插件查询数据库,如本报告所示:

数据库包含对应于x、y和z组合的Blob,这些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的形式获得结果

问题就到此为止:除了我甚至没有从查询中得到结果


感谢您的帮助

据我所知,大多数JavaScript实现都不支持blob

该代码假定数据库中的数据存储为Base64编码的文本(或者数据库驱动程序自动执行此转换)

您必须告诉数据库将blob转换为某种文本格式(
SELECT hex(tile_data).
),然后将该十六进制字符串转换为代码中的某种有用格式。

支持从预填充的sqlite数据库(如.mbtiles文件)读取blob

为了构建包含平铺数据的数据URL,您可以修改以下代码,这些代码取自:

```

```

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