【问题标题】:Chrome Extension with Database API interface带有数据库 API 接口的 Chrome 扩展
【发布时间】:2011-06-28 02:14:43
【问题描述】:

我想用我从 chrome 中的本地数据库生成的锚点列表来更新 div。这是非常简单的东西,但是当我尝试通过回调将数据添加到 main.js 文件时,一切都突然变得未定义。或者数组长度设置为0。(当它真的是18时。)

最初,我尝试将它安装到一个新数组中并以这种方式传回。

我需要在 chrome manifest.json 中指定一个设置以允许与数据库 API 进行通信吗?我查过了,但我只能找到“无限存储空间”

代码如下:

    window.main = {};
window.main.classes = {};
(function(awe){
    awe.Data = function(opts){
      opts = opts || new Object();
      return this.init(opts);
    };
    awe.Data.prototype = {
        init:function(opts){
            var self = this;
            self.modified = true;

            var db = self.db = openDatabase("buddy","1.0","LocalDatabase",200000);
            db.transaction(function(tx){
                tx.executeSql("CREATE TABLE IF NOT EXISTS listing ( name TEXT UNIQUE, url TEXT UNIQUE)",[],function(tx,rs){
                    $.each(window.rr,function(index,item){
                        var i = "INSERT INTO listing (name,url)VALUES('"+item.name+"','"+item.url+"')";
                        tx.executeSql(i,[],null,null);
                    });
                },function(tx,error){

                });
            });
            self._load()
            return this;
        },
        add:function(item){
            var self = this;
            self.modified = true;
            self.db.transaction(function(tx){
                tx.executeSql("INSERT INTO listing (name,url)VALUES(?,?)",[item.name,item.url],function(tx,rs){
                    //console.log('success',tx,rs)
                },function(tx,error){
                    //console.log('error',error)
                })
            });
            self._load()
        },
        remove:function(item){
            var self = this;
            self.modified = true;
            self.db.transaction(function(tx){
                tx.executeSql("DELETE FROM listing where name='"+item.name+"'",[],function(tx,rs){
                    //console.log('success',tx,rs)
                },function(tx,error){
                    //console.log('error',tx,error);
                });
            });
            self._load()
        },
        _load:function(callback){
            var self = this;
            if(!self.modified)
                return;
            self.data = new Array();
            self.db.transaction(function(tx){
                tx.executeSql('SELECT name,url FROM listing',[],function(tx,rs){
                    console.log(callback)
                    for(var i = 0; i<rs.rows.length;i++)
                    {

                        callback(rs.rows.item(i).name,rs.rows.item(i).url)
                        // var row = rs.rows.item(i)
                        // var n = new Object()
                        // n['name'] = row['name'];
                        // n['url'] = row['url'];
                    }
                },function(tx,error){
                    //console.log('error',tx,error)
                })
            })
            self.modified = false
        },
        all:function(cb){
            this._load(cb)
        },
        toString:function(){
            return 'main.Database'
        }
    }
})(window.main.classes);

以及更新列表的代码。

this.database.all(function(name,url){
       console.log('name','url')
       console.log(name,url)

       var data = []
       $.each(data,function(index,item){
           try{
               var node = $('<div > <a href="'+item.url+'">'+item.name + '</a></div>');
               self.content.append(node);
               node.unbind();
               node.bind('click',function(evt){
                   var t = $(evt.target).attr('href');
                   chrome.tabs.create({
                       "url":t
                   },function(evt){
                       self._tab_index = evt.index
                   });
               });
           }catch(e){
               console.log(e)
           }
       })    
   });

【问题讨论】:

    标签: javascript google-chrome-extension local-database


    【解决方案1】:

    通过查看您上面的代码,我注意到您正在 API 中每个函数的末尾执行“self._load()”。 HTML5 SQL 数据库是异步的,你永远无法保证结果。在这种情况下,我会假设结果将始终为 0 或随机,因为这将是一个竞争条件。

    我在我的 fb-exporter 扩展程序中做了类似的事情,请随意看看我是如何做到的 https://github.com/mohamedmansour/fb-exporter/blob/master/js/database.js

    为了解决这样的问题,您是否检查了 Web Inspector 并查看后台页面中是否出现任何错误。我假设这一切都在背景页面中,嗯?尝试查看是否发生任何错误,如果没有,我相信您遇到了竞态条件。只需在回调中移动负载,它就会正确调用负载。

    关于unlimited storage manifest 属性的第一个问题,在这种情况下您不需要它,这不应该是问题。 Web 数据库的限制是 5MB(最后我记得,它可能已经改变了),如果您使用大量数据操作,那么您使用该属性。

    只要确保你可以保证this.database.all在数据库初始化后运行。

    【讨论】:

      猜你喜欢
      • 2016-11-12
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      相关资源
      最近更新 更多