当我尝试将Json导入SQLite时,为什么会收到Uncaught TypeError?

时间:2012-09-20 19:07:11

标签: jquery json sqlite import

您好我使用下面的代码来读取文本文件并将其内容导入本地SQLite。

function billtxt()
{
    var billjson = '{"posts" : [', 
        i, 
        line = 0,
        bill = 0,
        Amountint,
        Amountdec;

        jQuery.ajaxSetup({
                'beforeSend' : function(xhr) {
                     xhr.overrideMimeType('text/plain; charset=iso-8859-7');
                },
        });

        jQuery.get('Bill.txt',function(data){
            var mybill = [];
            alert(data.length);
            line=0;
            for (i = 1; i <= ((data.length)/156); i += 1) {
                billjson += '{"Id" :' + '"' + data.substr((line+0), 10).trim() + '"'  + ',';
                billjson += '"Code" :' + '"' + data.substr((line+10), 5).trim() + '"'  +  ',';
                billjson += '"Address" :' + '"' + data.substr((line+14), 40).trim() + '"'  +  ',';
                billjson += '"Name" : ' + '"'  + data.substr((line+54), 50).trim() + '"'  +  ',';
                billjson += '"Description" : ' + '"'  + data.substr((line+104), 8).trim() + '"'  +  ',';
                billjson += '"EntrySeason" : ' + '"'  + data.substr((line+112), 23).trim() + '"'  +  ',';
                billjson += '"Period" : ' + '"'  + data.substr((line+112), 23).trim() + '"'  +  ',';
                Amountint = data.substr((line+146), 7).trim();
                Amountdec = data.substr((line+153), 2).trim();
                billjson += '"Revenue" : ' + '"'  + Amountint + '.' + Amountdec + '"'  +  '}';
                line = i * 156;
                if (line == data.length)
                {
                    billjson += ']';
                }
                else 
                {
                    billjson += ',';
                }
            }

            if (line == 0)
            {
                billjson += ']';
            }


            billjson += "}";

            alert(billjson);
            var mybilljson = jQuery.parseJSON( billjson );
            alert(mybilljson.posts.length);
        for (i = 0; i < (mybilljson.posts.length); i += 1) {

            $.mobile.notesdb.transaction((function(i) {
                return function(t){
console.log(mybilljson.posts[i].Name);
                    t.executeSql('INSERT into bill (barcode, buildingcode, buildingaddress, flatname, flatdescription, entryseason, period, amount) VALUES (?,?,?,?,?,?,?,?);',
                        [mybilljson.posts[i].Id, mybilljson.posts[i].Code, mybilljson.posts[i].Address, mybilljson.posts[i].Name, mybilljson.posts[i].Description, mybilljson.posts[i].EntrySeason, mybilljson.posts[i].Period, mybilljson.posts[i].Revenue]
                            );
                }
            })(i));

    }
});
}

但我重申了以下错误

Uncaught TypeError: Cannot read property 'Id' of undefined 

在以下行

[mybilljson.posts[i].Id, mybilljson.posts[i].Code, mybilljson.posts[i].Address, mybilljson.posts[i].Name, mybilljson.posts[i].Description, mybilljson.posts[i].EntrySeason, mybilljson.posts[i].Period, mybilljson.posts[i].Revenue]

我哪里错了?

3 个答案:

答案 0 :(得分:1)

您的第一个问题是,当您使用基于JavaScript的0时,您将阵列用作基于1的阵列 此

for (i = 1; i <= (mybilljson.posts.length); i += 1) {

应该是

for (i = 0; i < (mybilljson.posts.length); i += 1) {

另一个问题是你在循环中创建匿名函数,如果匿名函数在循环的下一次迭代之前没有执行i的值会改变,你可以使用IIFE返回一个函数将在循环的当前迭代中使用i的值。

            notesdb.transaction((function(i){ 
                return function(t) {
                    t.executeSql('INSERT into bill (barcode, buildingcode, buildingaddress, flatname, flatdescription, entryseason, period, amount) VALUES (?,?,?,?,?,?,?,?);',
                        [mybilljson.posts[i].Id, mybilljson.posts[i].Code, mybilljson.posts[i].Address, mybilljson.posts[i].Name, mybilljson.posts[i].Description, mybilljson.posts[i].EntrySeason, mybilljson.posts[i].Period, mybilljson.posts[i].Revenue]
                            );
                }
            })(i));

答案 1 :(得分:0)

for (i = 1; i <= (mybilljson.posts.length); i += 1) {

在javascript中,数组从零开始编制索引。相反,尝试:

for (i = 0; i < (mybilljson.posts.length); i++) {

坦率地说,你的代码有点混乱。我很幸运,我发现了这个错误。可能还有其他人。

答案 2 :(得分:0)

你的for循环应该从0开始。

for (i = 0; i < (mybilljson.posts.length); i++) {
  ....
}