【问题标题】:PhoneGapBuild - download sqlite db and connect to itPhoneGapBuild - 下载 sqlite db 并连接到它
【发布时间】:2015-05-14 04:01:57
【问题描述】:

我的头撞墙有一段时间了,希望蜂巢思维能帮助我。

我正在尝试从远程位置下载并附加一个 sqlite 数据库('database.db'),虽然我可以很好地下载它,但我正在努力使用 window.sqlitePlugin.openDatabase({ name : databaseName });

有任何想法或有人能够在 phonegapbuild 中下载并附加一个 sqlite 数据库吗?

var _urlContactsSqlite = 'https://www.dropbox.com/s/370lyi2w21pxgrs/database.db?dl=1';



function init() {
        var databaseName = 'database.db';
        window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, 
            function requestFileSystemSuccess(fs) {             //fs = filesystem
                console.log('requestFileSystemSuccess');
                fs.root.getDirectory('databases', { create: true },         //create the directory if it doesnt exist
                    function getDirectorySuccess(dataEntry) {
                        console.log('getDirectorySuccess');
                        fs.root.getFile('dummy.html', {create: true, exclusive: false}, 
                            function getFileSuccess(fileEntry) {
                                console.log('getFileSuccess');
                                var sPath = fileEntry.nativeURL.replace('dummy.html','') + 'databases/';
                                console.log('sPath: ' + sPath);
                                var ft = new FileTransfer();
                                ft.download(
                                    encodeURI(_urlContactsSqlite),
                                    sPath + databaseName, 
                                    function downloadSuccess(entry) {
                                      console.log('downloadSuccess - what now smarty pants');
                                      console.log('now we have the database in a location, we should try and open it.');
                                      $rootScope._db = window.sqlitePlugin.openDatabase({
                                                name : databaseName
                                      });
                                        console.log('attempting to get a count of the contacts table');
                                        var promise = dbQuery.contacts_Count();
                                        promise
                                            .then(function(data) {
                                                console.log(data);
                                                alert(data);    
                                            })
                                            .catch(function(error) {
                                                console.log('error occurred inside promise : ' + error );
                                            });
                                    }, 
                                    function downloadFail(e) {
                                        console.log('downloadFail', e);
                                        console.log('error source ' + e.source);
                                        console.log('error target ' + e.target);
                                        console.log('error code ' + e.code);
                                    }, 
                                  false, null); //end fileTransfer                                  
                            },
                            function getFileFail(e) {
                                console.log('getFileFail',e);
                            }
                        );
                    }, 
                    function getDirectoryFail(e) 
                    {
                        console.log('getDirectoryFail',e);
                    }
                  );        //end requestFileSystem
            },
            function requestFileSystemFail(){
                console.log('requestFileSystemFail');
            }
        );  //end requestFileSystem
    }   // end init()

dbQuery.contacts_Count();

function contacts_Count() {
            var deferred = $q.defer();
            setTimeout(function() {
                    $rootScope._db.transaction(function(tx) {
                            var sql = 'SELECT COUNT(*) AS COUNT FROM contacts;';
                            console.log(sql);
                            tx.executeSql(sql, [], function(tx, results) {
                                    var rowCount = results.rows.item(0).COUNT;
                                    console.log('rowcount: ' + rowCount);
                                    deferred.resolve(rowCount);
                            }, null);
                    });

            },1);
            return deferred.promise;
    }

【问题讨论】:

    标签: javascript android iphone sqlite phonegap-build


    【解决方案1】:

    我猜这是因为 SqlitePlugin 在哪里寻找您的数据库。它显示在您的代码中,您正在将其下载到数据库目录,而插件仅在 www 子目录中查找。根据预填充数据库的documentation

    对于 Android 和 iOS(仅限):将数据库文件放在 www 目录并打开数据库,如下所示:

    var db = window.sqlitePlugin.openDatabase({name: "my.db", createFromLocation: 1});
    

    ---- 在下面编辑:

    考虑在_db.transaction 函数中添加一些错误检查,如下所示:

    $rootScope._db.transaction(function(tx) {
            var sql = 'SELECT COUNT(*) AS COUNT FROM contacts;';
            console.log(sql);
            tx.executeSql(sql, [], function(tx, results) {
                    var rowCount = results.rows.item(0).COUNT;
                    console.log('rowcount: ' + rowCount);
                    deferred.resolve(rowCount);
            }, null);
        },
        function(error) {
            console.log('db error: ' + error.message);
        });
    

    【讨论】:

    • 感谢 Mike 的回复 :) 我删除了数据库引用并将上面的示例与 createFromLocation 参数一起使用。控制台日志如下但仍然没有骰子? code sPath: file:///data/data/my.app.reverse.url/files/files/ downloadSuccess 现在我们的数据库在某个位置,我们应该尝试打开它。 SQLitePlugin openargs: {"name":"database.db","createFromLocation":1} 试图获取联系人表的计数 SELECT COUNT(*) AS COUNT FROM contacts; .... 没有别的 code 再次感谢!
    • 我建议编辑您的帖子以包含 dbQuery.contacts_Count 函数中的内容。此外,我认为您没有正确使用承诺。一旦您发布该函数中的内容,我们将重新讨论。
    • 没问题。你的承诺看起来不错。我已经编辑了我的答案。肯定会在 db 处理本身中添加更多错误检查。
    • 控制台返回“没有错误处理程序的语句失败:没有这样的表:联系人(代码 1)”。看来数据库毕竟没有被附加。
    • 我建议在不下载数据库的情况下进行简单的概念验证。手动将数据库放到手机上,然后尝试打开它。如果没有,请尝试确保它位于项目的 www 目录中。一旦你把它记下来,剩下的对你来说应该是微不足道的。祝你好运!
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多