2017-02-12 24 views
0

Я следую этому руководству: https://kuamoto.wordpress.com/2016/02/26/myth-1-cant-make-offline-apps/, чтобы получать офлайн-карты в приложении ionic 2 на базе базы данных sqlite (.mbtiles). Я использую плагин Cordova Sqlite для запроса базы данных, как показано в этом репо: https://github.com/wilblack/offline-map-exampleНевозможно преобразовать BLOB в String с плагином Cordova sqlite для офлайн-карт

База данных содержит 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? за исключением того, что я даже не получить результат из запроса

Спасибо за вашу помощь

ответ

0

Насколько я знаю, большинство JavaScript реализации не поддержка blobs.

Этот код предполагает, что данные в базе данных хранятся в виде кодированного в Base64 текста (или что драйвер базы данных делает это преобразование автоматически).

Вы должны сообщить базе данных, чтобы преобразовать blob в некоторый текстовый формат (SELECT hex(tile_data) ...), а затем преобразовать эту шестнадцатеричную строку в какой-то полезный формат в вашем коде.

0

Cordova-sqlite-ext поддерживает чтение BLOB из предварительно заполненных баз данных sqlite, таких как .mbtiles-файлы.

Для построения данных-адреса, содержащие данные плитки вы можете адаптировать следующий код, взятый из 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); 
    }); 
}); 

` ``

 Смежные вопросы

  • Нет связанных вопросов^_^