• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

javascript - 创建自定义事件,例如 ionicPlatform.ready() 或 document.ready()

[复制链接]
菜鸟教程小白 发表于 2022-12-11 18:36:58 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我有一个使用数据库的 Ionic 应用程序。我想用一个文件的内容填充这个数据库。
这部分我开始工作了。我想创建一个 DB.ready() 事件,就像 $ionicPlatform.ready()document.ready() 一样,我需要等到数据库加载完毕后再查询。

我对 Ionic 和 Promises 的概念相当陌生,所以它可能很简单。

我已经让它在 Android 中工作,但 iOS 在查询中不断返回错误,并显示“someTablename 不存在”。我已经放置了多个 console.log(),根据这些一切都很好。

谁能告诉我我做错了哪一部分,或者在这种情况下更常见的另一种方法(再次,我是新手,所以不知道什么是常见的)?
我希望每次查询都会记录“query”,但它没有这样做,这很重要吗?

// L35_DB - Databaseclass for apps
.factory('L35_DB', ['$ionicPlatform','$cordovaFile','$cordovaSQLite', function($ionicPlatform, $cordovaFile,$cordovaSQLite) {
    var L35_DB = {db_start : false};
    //-------------------------------------
    DB_READY = new Promise(function(resolve,reject){
        console.log("query");
        if( L35_DB.db_start ){console.log("b"); resolve("Stuff worked!"); }
        else{
            var filename='fileWithDB.db';
            $ionicPlatform.ready(function() {
                if( window.cordova ){
                    return window.plugins.sqlDB.copy(filename, 0, 
                        function(info){ loadDB(filename).then( function(){ console.log("First load", info);  resolve("DB loaded?"); }) }, 
                        function(info){ loadDB(filename).then( function(){ console.log("Other loads", info); resolve("DB loaded?"); }) } 
                    );
                }
            });
        }
    });
    //-------------------------------------
    // Load the file
    function loadDB(filename){
        var loading = new Promise(function(resolve,reject){
            db = window.sqlitePlugin.openDatabase(
                                        {name: filename, location: 'default'}, 
                                        function(){
                                            console.log("loadDB success"); // <--- fired
                                            L35_DB.db_start = true; // true, so next call we don't do all this
                                            resolve("DB ready loading");
                                        },
                                        function(err){ reject(err);}
                                    );
        });
        return loading;
    }
    //-------------------------------------
    // Query -
    var _query = function(query,values){
        if( !L35_DB.db_start ){
            console.error("DB not init");
            return false;
        }
        else if( window.cordova ){
            values = values || [];
            var actualQuery = new Promise(function(resolve,reject){
                db.executeSql(query, values, resolve, reject);
            })
            return actualQuery;
        }
    }
    //-------------------------------------
    return {
        query : _query
    };
}])

在我的整个应用程序中我都这样做:

DB_READY.then(function () {
  L35_DB.query("SELECT * FROM systems").then(function (result) {
    // Something something something darkside
  })
})



Best Answer-推荐答案


经过大量测试和挖掘,结果是 window.plugins.sqlDB.copy()是罪魁祸首。

第二个值,位置,可以更改。它默认为 0,但对于 iOS,它必须是 2。在此更改之后,一切都按预期工作。

这个函数应该为 Android 和 iOS 预加载数据库,假设它实际上这样做有点太早了。

关于javascript - 创建自定义事件,例如 ionicPlatform.ready() 或 document.ready(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41714863/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap