为什么Lawnchair的webkit-sqlite适配器将密钥转换为字符串?

时间:2013-07-25 20:32:50

标签: javascript web-sql lawnchair

我在webkit-sqlite适配器上遇到了问题。它以某种方式将key保存在字符串格式而不是整数上。 Indexed-db工作得很好。它不会将密钥转换为字符串。请参阅下面的代码。

var ppl = Lawnchair({adapter: 'webkit-sqlite', name:'people', record:'person'}, function(people) {
    // anon fn bound to the instance
    this.save({key:1, id:1, a:1, name:'nino'}, function(obj){
        console.log(obj);
    });

    // anon fn bound to the instance
    this.save({key:'2', id:2, a:2, name:'paolo'}, function(obj){
        console.log(obj);
   });

    // get all the keys
    this.keys(function(keys) {
        console.log('keys:', keys);
    });

    // get 1
    this.get(1, function(key) {
        console.log('key:', key);
    });

    // get '2'
    this.get('2', function(key) {
        console.log('key:', key);
    });

    // we can also clear the entire collection w/ nuke
    this.nuke()
});

输出:

undefined
Object {key: 1, id: 1, a: 1, name: "nino"}
Object {key: "2", id: 2, a: 2, name: "paolo"}
keys: ["1.0", "2"]
key: undefined
key: Object {key: "2", id: 2, a: 2, name: "paolo"}

错误:

请参见keys: ["1.0", "2"]它应该是keys: [1, "2"]

有人有补丁吗?

感谢。

2 个答案:

答案 0 :(得分:2)

具有讽刺意味的是,今天我在试验草坪时遇到了同样的问题。我最终决定修改webkit-sqlite适配器以添加/编辑行,以便在将键值传递给db之前将其转换为字符串。问题源于这样的事实:必须将用于草坪椅键值的字段(在这种情况下为id)建立为NVARCHAR(32)数据类型,出于兼容性原因这是有意义的。请记住,您可以将webkit-sqlite db与基于整数的id字段一起使用,但是然后尝试将其与草坪椅集成将是复杂或不可能的。我的解决方案是在将数值传递给db之前将其转换为字符串。这可以在不修改适配器的情况下完成,但出于我的目的,我希望在indexeddb可用时将整数用作整数。

以下是我的代码的链接:http://wemarketyour.com/lawnchair-using-indexeddb-websql-dom-localstorage-adapters/

突出显示webkit-sqlite适配器中修改代码的行。与我的版本的不同之处在于,在仍然转换为字符串时,数据将被保留。因此,而不是int 1 =>字符串“1.0”,你得到int 1 =>字符串“1”。稍后当您检索数据时,您可以使用parseInt(key)将密钥转换回整数。

答案 1 :(得分:1)

实际上,我也修了它。

https://github.com/brianleroux/lawnchair/issues/58#issuecomment-21647070

你可以检查那里。让我知道。