我实际上正在研究正在读取(而不是写入).mbtiles文件的cordova应用程序。那是一个用图块归档的数据库,以便显示带有传单的离线 map 。

有关文件的所有内容(称为test.mbtiles)都可以正常工作:下载并打开。但是仍然有一个大问题。我无法阅读表格。这是我的代码的非功能性示例:

getTileUrl: function (tilePoint, callBack) {
    var x = tilePoint.x;
    var y = tilePoint.y;
    var z = tilePoint.z;

    var base64Prefix = 'data:image/png;base64,';

    var db2 = new window.sqlitePlugin.openDatabase({name: 'test.mbtiles'});

    db2.transaction(function(tx) {

        tx.executeSql("SELECT tile_data FROM images INNER JOIN map ON images.tile_id = map.tile_id WHERE zoom_level = ? AND tile_column = ? AND tile_row = ?", [z, x, y], function (tx, res) {

                if(res.rows.length>0) {
                    console.log("success");
                    var src = base64Prefix + res.rows.item(0).tile_data;
                    callBack(src);
                }
                else {
                    console.log("response : no data");
                }
                }, function (tx, er) {
                    console.log('error with executeSql : ', er.message);
                    return;
                });
            });
   }

所以现在每次我尝试使用离线 map (使用设备上存在的来自test.mbtiles的图块)时,都会出现此错误:
error with executeSql :  no such table: images (code 1): , while compiling: SELECT tile_data FROM images INNER JOIN map ON images.tile_id = map.tile_id WHERE zoom_level = ? AND tile_column = ? AND tile_row = ?

因此,我假设要获取的文件test.mbtiles不好,因为它没有任何images表。但这是错误的。我使用SQLite Database Browser来查看我的数据库方案,发现images表在这里并填充了正确的数据。

有没有其他人遇到此错误,并且知道如何解决?

顺便说一句,我正在使用最新版本的SQLite插件和Cordova,并且主要在android上进行测试(如果android可以正常运行,则会移植到ios)。并且我将尽可能只使用.js文件,而不在任何Java类中添加任何此类文件(会破坏整个工作流程)。

谢谢。

最佳答案

MBTiles规范stores tiles in a table called tiles , not images

10-06 13:58