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