如何在Cordova中压缩(压缩)SQLITE数据库文件?

时间:2018-11-02 09:28:57

标签: ios sqlite cordova zip windows-mobile

我需要为当前在Windows Mobile和iOS上运行的Cordova应用程序提供“支持”模式。为此,我需要压缩sqlite数据库文件并将其上传到服务器。数据库必须经过压缩,因为它可能会增长到250MB以上,并且上传必须能够在没有wifi连接的情况下进行。

在网络上搜索提出了不同的方法,但是所有方法都已过时或仅解决了我的iOS或Windows Mobile问题。例如,当使用Cordova文件插件时,我在插件文档中遇到了这个问题:

  

支持的平台

     

Android iOS OS X Windows *浏览器

     
      
  • 这些平台不支持FileReader.readAsArrayBuffer或FileWriter.write(blob)。
  •   

这是我的方法:Cordova - Zip files and folders on iOS

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我建议您再给FileReader()一次机会。

就我而言,这可能与您非常相似,我使用FilerReader.readAsArrayBuffer读取了一个文件,然后,使用JSZip库对其进行压缩:http://stuartk.com/jszip

反对cordova-file-plugin的API文档(https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file/) “ Windows *”->“这些平台不支持FileReader.readAsArrayBuffer或FileWriter.write(blob))” 我体验到readAsArrayBuffer在Windows UWP平台下可以工作,但是速度较慢。

因此,对于我来说,文件大小约为50M我必须等待近2分钟才能完成整个过程!

尝试遵循以下示例:

您需要适应您的路径,但这可以在WINDOWS UWP和IOS上运行(没有在Android上进行测试,但这不是您的问题)。

此外,您将需要实现自己的错误处理程序(errorHandler)。 该解决方案使用Promises,因为您必须等待文件被读取和压缩。

PS1:始终确保触发了“设备就绪事件”,以便访问插件。

PS2:您可能会禁止对数据库文件的访问权限,这可能与以下事实有关:该文件正在被另一个进程使用。         确保数据库已关闭。         SQLITE:

        var sqlite = window.sqlitePlugin.openDatabase({ name: 'yourdb.db', location: 'default' });
        sqlite.close(function () {
            console.log("DONE closing db");
        }, function (error) {
            console.log("ERROR closing db");
            console.log(JSON.stringify(error));
        });

“邮政编码”功能:

    function zipFile(sourceFileName, targetFileName) {
    return new Promise(function (resolve, reject) {
        window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fs) {
            fs.root.getFile(sourceFileName, { create: false, exclusive: false }, function (fe) {
                fe.file(function (file) {
                    var reader = new FileReader();
                    reader.onloadend = function (data) {
                        var zip = new JSZip();
                        zip.file(sourceFileName, data.target.result);
                        zip.generateAsync({
                            type: "blob",
                            compression: "DEFLATE",
                            compressionOptions: {
                                level: 9
                            }
                            // level 9 means max. compression
                            // this may also take some time depending on the size of your file
                            // I tested it with a 50M file, it took about 65 sec.
                        }).then(

                            // following is post-zip in order to transfer the file to a server
                            function (blob) {
                                fs.root.getFile(targetFileName, { create: true, exclusive: false }, function (newzip) {
                                    writeFile(newzip, blob, "application/zip").then(function () {
                                        var f = blob;
                                        var zipReader = new FileReader();

                                        zipReader.onloadend = function (theFile) {
                                            var base64 = window.btoa(theFile.target.result);
                                            resolve(base64);
                                        };
                                        // need to "resolve" the zipped file as base64 in order to incluse it in my REST post (server-upload)
                                        zipReader.readAsBinaryString(f);
                                    });

                                });

                            }
                        )
                    };
                    reader.readAsArrayBuffer(file); 
                    // this may take some time depending on the size of your file
                    // I tested it with a 50M file, it took about 72 sec.
                }, errorHandler);
            }, errorHandler);
        });
    });
}

紧急呼叫:

if (window.cordova) {
    document.addEventListener('deviceready', function () {
        zipFile("yourDatabaseFileName.db","compressedDatabaseFile.zip");
    });
} 

答案 1 :(得分:1)

为什么不使用sqlite“ .dump”命令作为查询并通过Steam获得结果,然后压缩输出。即使文本转储会更大,也可以在压缩时获得合理的大小。我认为也有一些非常好的纯文本压缩算法,