无法将BLOB转换为带有Cordova s​​qlite插件的字符串以用于脱机地图

问题描述:

我正在关注本教程:https://kuamoto.wordpress.com/2016/02/26/myth-1-cant-make-offline-apps/以基于sqlite数据库(.mbtiles)的离子2应用程序获取离线地图。我使用Cordova Sqlite插件查询数据库,如此回购:https://github.com/wilblack/offline-map-example无法将BLOB转换为带有Cordova s​​qlite插件的字符串以用于脱机地图

该数据库包含Blob,对应于x,y和z的组合,用于显示我想要显示的地图位置。

我已经成功地打开数据库和查询,但我卡住了,出现以下错误:

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文件)中读取BLOB。

为了构建含有瓦片数据可以适应从README采取以下代码数据的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); 
    }); 
}); 

```