2014-01-20 4 views
0

android에서 phonegap 2.9.0을 사용하여 여러 데이터베이스에 쓰는 데 문제가 있습니다. 모든 것이 iOS 및 리플 에뮬레이터에서 제대로 작동하는 것으로 보입니다. 그러나 삼성 갤럭시 S3를 사용할 때 (다른 Android 기기에서도 마찬가지 인 것 같습니다.) '다음 표는 존재하지 않습니다.'오류가 발생합니다. 테이블에 행을 작성하십시오.Phonegap 여러 데이터베이스 작성 Android "해당 테이블이 없습니다."

json 객체를 구문 분석하여 열 이름, 데이터베이스 이름 등을 가져온 다음 데이터를 보내 데이터베이스에 기록합니다. 각 데이터베이스에 상당한 양의 데이터가 기록 될 수 있으므로 각 테이블에 대해 별도의 데이터베이스를 만들고 있습니다.

일반적으로 첫 번째 데이터베이스/테이블은 성공적으로 실행되지만 성공 콜백은 연속적인 "create table"SQL 문과 "insert"문에 대해 호출되지만 데이터베이스에서 읽으려고하면 오류 ""Table_CategoryClass ""같은 테이블이 없습니다. 테이블을 만들고 행을 작성할 때 모든 성공 콜백이 시작됩니다. 그러나 db를 읽을 때가되면 첫 번째 테이블을 제외한 모든 테이블이 생성되지 않고 행 삽입 문이 연속 된 테이블에 쓰지 않는 것처럼 보입니다.

모든 비동기 함수를 제어하기 위해 지연 유형 프로세스를 사용했지만이를 폐기하고 성공/오류 콜백에 모든 것을 넣어보다 쉽게 ​​읽고 따르도록했습니다. 다음과 같이

내 코드입니다 : 내가 문제를 언급 한 바와 같이

var mobile_database = {"Category":[{ "id":"494", "CategoryClassID":"26", "Name":"Bathroom", "ParentCategoryID":"0"}, { "id":"500", "CategoryClassID":"25", "Name":"Bathroom Butler", "ParentCategoryID":"0"}, { "id":"487", "CategoryClassID":"25", "Name":"C&A", "ParentCategoryID":"0"}, { "id":"493", "CategoryClassID":"25", "Name":"Cobra", "ParentCategoryID":"0"}, { "id":"490", "CategoryClassID":"27", "Name":"Commercial", "ParentCategoryID":"0"}, { "id":"489", "CategoryClassID":"27", "Name":"Domestic", "ParentCategoryID":"0"}, { "id":"501", "CategoryClassID":"25", "Name":"Dutton", "ParentCategoryID":"0"}, { "id":"498", "CategoryClassID":"26", "Name":"Fire Equipment", "ParentCategoryID":"0"}, { "id":"507", "CategoryClassID":"25", "Name":"Genebre", "ParentCategoryID":"0"}, { "id":"496", "CategoryClassID":"26", "Name":"Geyser", "ParentCategoryID":"0"}, { "id":"509", "CategoryClassID":"25", "Name":"Gv Di Bella", "ParentCategoryID":"0"}, { "id":"491", "CategoryClassID":"27", "Name":"Industrial", "ParentCategoryID":"0"}, { "id":"504", "CategoryClassID":"25", "Name":"Isca", "ParentCategoryID":"0"}, { "id":"503", "CategoryClassID":"26", "Name":"Kitchen", "ParentCategoryID":"0"}, { "id":"495", "CategoryClassID":"25", "Name":"Kwikot", "ParentCategoryID":"0"}, { "id":"499", "CategoryClassID":"25", "Name":"Libra", "ParentCategoryID":"0"}, { "id":"502", "CategoryClassID":"25", "Name":"Plexicor", "ParentCategoryID":"0"}, { "id":"492", "CategoryClassID":"25", "Name":"Rak", "ParentCategoryID":"0"}, { "id":"497", "CategoryClassID":"25", "Name":"Safequip", "ParentCategoryID":"0"}, { "id":"506", "CategoryClassID":"25", "Name":"Salvatore", "ParentCategoryID":"0"}, { "id":"505", "CategoryClassID":"26", "Name":"Shower", "ParentCategoryID":"0"}, { "id":"488", "CategoryClassID":"26", "Name":"Toilet", "ParentCategoryID":"0"}, { "id":"508", "CategoryClassID":"25", "Name":"Vaal", "ParentCategoryID":"0"}], "CategoryClass":[{ "id":"25", "Color":"lightblue", "Name":"Brand"}, { "id":"27", "Color":"lightblue", "Name":"Category"}, { "id":"26", "Color":"lightblue", "Name":"Room/Area"}]}; 


function get_some_element3(){ 

    $("#loading").html("Setting up database"); 

     var mobile_data = mobile_database;//global variable containing sample data to populate db 

     var column_names = get_column_names(mobile_data);//returns a json obj with array of column names "tablename": "[columns]" 
     var sql_columns_obj = create_sql_columns(column_names);// returns a json obj containing {"table_name":{sql_table:"(etc...)", sql_column:"(etc...)"}, "table2":{...}} 

     var create_table_array = []; 

     // function sorting out column names to create tables/open databases etc... seems to be working fine. 
     $.each(sql_columns_obj, function(k, v){ 
      var element = {}; 
      element["DB_Name"] = "DB_"+k; 
      element["Other_DB_Name"] = "DB_"+k+"_other"; 
      element["Table_Name"] = "Table_"+k; 
      element["sql_columns_table"] = v["sql_columns_table"]; 
      element["sql_columns"] = v["sql_columns"]; 
      element["columns"] = column_names[k]; 
      element["data"] = mobile_data[k]; 
      create_table_array.push(element); 
     }); 

     var table_index = 0; 

     //create_tables3(create_table_array[table_index]); 
     create_tables3(create_table_array); 

     function create_tables3(create_table_array){ 
      write_to_table_new3(create_table_array); 
     }; 
}; 

var super_index = 0; 

//function write_to_table_new(DB_Name, Other_DB_Name, Table_Name, data, Columns, sql_columns, sql_columns_table){ 
function write_to_table_new3(create_table_array){ 

    var DB_Name = create_table_array[super_index]["DB_Name"]; 
    alert("DB_Name: "+DB_Name); 
    var Other_DB_Name = create_table_array[super_index]["Other_DB_Name"]; 
    var Table_Name = create_table_array[super_index]["Table_Name"]; 
    var data = create_table_array[super_index]["data"]; 
    var Columns = create_table_array[super_index]["columns"]; 
    var sql_columns = create_table_array[super_index]["sql_columns"]; 
    var sql_columns_table = create_table_array[super_index]["sql_columns_table"]; 

    var loading = document.getElementById("loading"); 
    loading.innerHTML=""; 

    //var dfd_write = new jQuery.Deferred();// !!! deferred 

    var db = null; 
    var db = window.openDatabase(DB_Name, "1.0", Other_DB_Name, 8000000);// 5MB limit per ?DB? 

    create_sql_table(); 

    function create_sql_table(){ 
     db.transaction(function(tx){ 
      alert('CREATE TABLE IF NOT EXISTS '+Table_Name+' '+sql_columns_table+''); 
      tx.executeSql('DROP TABLE IF EXISTS '+Table_Name+'', null, sql_droptable_success, sql_droptable_error); 
      tx.executeSql('CREATE TABLE IF NOT EXISTS '+Table_Name+' '+sql_columns_table+'', null, sql_table_success, sql_table_error); 
     }); 

     function sql_table_success(){ 
      alert("SQL Table Success"); 
      write_sql_rows(); 
     }; 

     function sql_table_error(tx, err){ 
      alert("SQL Table Error: "+err.message); 
     }; 

     function sql_droptable_success(){ 
      alert("SQL Table drop Success"); 
     }; 

     function sql_droptable_error(tx, err){ 
      alert("SQL Table drop Error: "+err.message); 
     }; 

    }; 

    function write_sql_rows(){ 

     var row_index = 0; 
     write_rows(); 

     function write_rows(){ 

      db.transaction(function(tx){ 
       var VALUES = '('; 
       var data_value = ""; 
       for (var j=0; j<Columns.length; j++){ 
        var key = Columns[j]; 
        if (key != 'id'){ 
         data_value = '"'+data[row_index][key]+'"'; 
        }else { 
         data_value = data[row_index][key]; 
        }; 

        if (j == 0){ 
         VALUES += data_value; 
        }else{ 
         VALUES += ', '+data_value; 
        }; 

       }; 

       VALUES += ')'; 
       tx.executeSql('INSERT OR REPLACE INTO '+Table_Name+' '+sql_columns+' VALUES '+VALUES+'', null, row_success, row_error); 
      }); 

      function row_success(){ 
       row_index += 1; 
       if (row_index < data.length){ 
        write_rows(); 
       }else{ 
        alert("Done Writing Rows"); 
        //dfd_write.resolve("success-write"); 
        super_index += 1; 
        if (super_index < create_table_array.length){ 
         write_to_table_new(create_table_array); 
        }else{ 
         alert("Synced!"); 
         super_index = 0; 
         $("#loading").hide(); 
        }; 
       }; 
      }; 

      function row_error(tx, err){ 
       alert("SQL Row Error: "+err.message); 
       //dfd_write.reject("fail-write"); 
      }; 

     }; 

    }; 

    // return dfd_write.promise(); 

}; 


function drop_all_tables(){ 
    var db = null; 
    var db = window.openDatabase("DB_Products", "1.0", "DB_Products_other", 8000000);// 5MB limit per ?DB? 

    db.transaction(function(tx){ 
     tx.executeSql('DROP TABLE IF EXISTS Table_Products'); 
    }); 

    var db = null; 
    var db = window.openDatabase("DB_ProductCategory", "1.0", "DB_ProductCategory_other", 8000000);// 5MB limit per ?DB? 

    db.transaction(function(tx){ 
     tx.executeSql('DROP TABLE IF EXISTS ProductCategory'); 
    }); 

    var db = null; 
    var db = window.openDatabase("DB_Category", "1.0", "DB_Category_other", 8000000);// 5MB limit per ?DB? 

    db.transaction(function(tx){ 
     tx.executeSql('DROP TABLE IF EXISTS Table_Category'); 
    }); 

    var db = null; 
    var db = window.openDatabase("DB_CategoryClass", "1.0", "DB_CategoryClass_other", 8000000);// 5MB limit per ?DB? 

    db.transaction(function(tx){ 
     tx.executeSql('DROP TABLE IF EXISTS Table_CategoryClass'); 
    }); 
}; 

은 안드로이드와 것 같다. 몇 사람이 비슷한 문제를 겪은 것 같았지만 이전 버전의 phonegap에서는 2.9.0이 아니 었습니다. 예를 들어 here입니다.

나는 현상금을 제공 할 수 있다면 큰 도움이나 조언을 부탁드립니다.

답변

0

이 질문은 실제로 오래되었지만 나는 그것에 찌르기를 좋아합니다. 개별 실행에서 성공 콜백을 가져 와서 db.transaction에 추가하십시오. 나는 각각의 실행 콜백이 성공한 트랜잭션의 내부에서 다중 실행을 수행하는 것과 유사한 문제를 가지고 있었고,이를 뒤죽박죽이었다. 내가 제안하는 변화를 만들어 내 문제를 해결했다. 비동기 트랜잭션과 관련이 있다고 생각합니다.

db.transaction(function(tx){ 
     alert('CREATE TABLE IF NOT EXISTS '+Table_Name+' '+sql_columns_table+''); 
     tx.executeSql('DROP TABLE IF EXISTS '+Table_Name+'', null, null, errorCB); 
     tx.executeSql('CREATE TABLE IF NOT EXISTS '+Table_Name+' '+sql_columns_table+'', null, null, errorCB); 
    },errorCB,successCB); 
+0

이전 질문에도 불구하고 이동해 주셔서 감사합니다. 나는 당신이 무언가를하고 있다고 생각합니다. 코드는 너무 복잡해서 모든 미친 콜백 수에 대해 더 많은 통제가 필요합니다. 나는 이것으로 돌아 왔음에 틀림없지 만, 적어도 필자의 경우 오류는 db를 읽을 때 잘못된 SQL이 사용되었다는 것이 드러났습니다. 테이블 이름을 참조 할 때 따옴표를 생략했습니다. 하지만 나는 그 지능이 있기 때문에 어쨌든 대답을 받아 들일 것입니다. –