2013-07-22 2 views
1
나는 (그래, 나는 그것이되지 않습니다 알고) WebSQL에 mysqlf를 도입하고있어

작업, 그리고이 문제로 실행하지 :WebSQL 자동 증가 다음과 같이 <p></p> 내가 JS를 통해 데이터베이스를 생성 ...

function initDb(){ 

try { 
    if (!window.openDatabase) { 
     alert('Databases are not supported in this browser.'); 
    } else { 

     var db = getDb(); 

     db.transaction(function (tx){ 
      tx.executeSql("CREATE TABLE IF NOT EXISTS tipofiesta (id INTEGER AUTO_INCREMENT, honor TEXT, descripcion_en TEXT, descripcion_es TEXT, descripcion_eu TEXT, PRIMARY KEY (id))", []); 
      tx.executeSql("CREATE TABLE IF NOT EXISTS localizacion (id INTEGER AUTO_INCREMENT, latitud TEXT, longitud TEXT, PRIMARY KEY (id))", []); 
      tx.executeSql("CREATE TABLE IF NOT EXISTS claseacto (id INTEGER AUTO_INCREMENT, nombre_en TEXT, nombre_es TEXT, nombre_eu TEXT, descripcion_en TEXT, descripcion_es TEXT, descripcion_eu TEXT, CONSTRAINT id_pk PRIMARY KEY (id))", []); 
      tx.executeSql("CREATE TABLE IF NOT EXISTS AdministradorFiestas (id INTEGER AUTO_INCREMENT, nombreUsuario TEXT, pass TEXT, email TEXT, verificado BOOLEAN DEFAULT FALSE, CONSTRAINT id_pk PRIMARY KEY (id))", []); 
      tx.executeSql("CREATE TABLE IF NOT EXISTS provincia (id INTEGER AUTO_INCREMENT, nombreCas varchar(25) DEFAULT 'nombre de provincia', nombreEus varchar(25) DEFAULT 'probintzia izena', id_localizacion INTEGER, CONSTRAINT id_pk PRIMARY KEY (id), FOREIGN KEY (id_localizacion) REFERENCES localizacion(id))", []); 
      tx.executeSql("CREATE TABLE IF NOT EXISTS pueblo (id INTEGER AUTO_INCREMENT, nombreCas TEXT, nombreEus TEXT, id_localizacion INTEGER, id_provincia INTEGER, CONSTRAINT id_pk PRIMARY KEY (id), FOREIGN KEY (id_localizacion) REFERENCES localizacion(id), FOREIGN KEY (id_provincia) REFERENCES provincia(id))", []); 
      tx.executeSql("CREATE TABLE IF NOT EXISTS fiesta (id INTEGER AUTO_INCREMENT, nombre TEXT, descripcion_eu TEXT, descripcion_en TEXT, descripcion_es TEXT, id_pueblo INTEGER, id_tipofiesta INTEGER, id_fechafiestaanyo INTEGER, CONSTRAINT id_pk PRIMARY KEY (id), FOREIGN KEY (id_pueblo) REFERENCES pueblo(id), FOREIGN KEY (id_tipofiesta) REFERENCES tipofiesta(id), FOREIGN KEY (id_fechafiestaanyo) REFERENCES fechafiestaanyo(id))", []); 
      tx.executeSql("CREATE TABLE IF NOT EXISTS fechafiestaanyo (id INTEGER AUTO_INCREMENT, fechaInicio date, fechaFin date, id_fiesta INTEGER, CONSTRAINT id_pk PRIMARY KEY (id), FOREIGN KEY (id_fiesta) REFERENCES fiesta(id))", []); 
      tx.executeSql("CREATE TABLE IF NOT EXISTS diafiesta (id INTEGER AUTO_INCREMENT, fecha date, nombre TEXT, descripcion_en TEXT, descripcion_es TEXT, descripcion_eu TEXT, id_fechafiestaanyo INTEGER, CONSTRAINT id_pk PRIMARY KEY (id), FOREIGN KEY (id_fechafiestaanyo) REFERENCES fechafiestaanyo(id))", []); 
      tx.executeSql("CREATE TABLE IF NOT EXISTS acto (id INTEGER AUTO_INCREMENT, nombre_en TEXT, nombre_es TEXT, nombre_eu TEXT, descripcion_en TEXT, descripcion_es TEXT, descripcion_eu TEXT, horaInicio time, horaFinAprox time, id_localizacion INTEGER, id_diafiesta INTEGER, CONSTRAINT id_pk PRIMARY KEY (id), FOREIGN KEY (id_localizacion) REFERENCES localizacion(id), FOREIGN KEY (id_diafiesta) REFERENCES diafiesta(id))", []); 
      tx.executeSql("CREATE TABLE IF NOT EXISTS actoclases (id INTEGER AUTO_INCREMENT, id_acto INTEGER, id_claseacto INTEGER, CONSTRAINT id_pk PRIMARY KEY (id), FOREIGN KEY (id_acto) REFERENCES acto(id), FOREIGN KEY (id_claseacto) REFERENCES claseacto(id))", []); 
      tx.executeSql("CREATE TABLE IF NOT EXISTS AdministradorFiestasPueblo (id INTEGER AUTO_INCREMENT, idAdministradorFiestas INTEGER, idPueblo INTEGER, CONSTRAINT id_pk PRIMARY KEY (id), FOREIGN KEY (idAdministradorFiestas) REFERENCES AdministradorFiestas(id), FOREIGN KEY (idPueblo) REFERENCES pueblo(id))", []); 
      tx.executeSql("CREATE TABLE IF NOT EXISTS tipofiestadefiesta (id INTEGER AUTO_INCREMENT, id_tipofiesta INTEGER, id_fiesta INTEGER, CONSTRAINT id_pk PRIMARY KEY (id), FOREIGN KEY (id_tipofiesta) REFERENCES tipofiesta(id), FOREIGN KEY (id_fiesta) REFERENCES fiesta(id))", []); 
     }); 

    } 
    return; 
} catch(e) { 

    if (e == 2) { 
     // Version number mismatch. 
     console.log("Invalid database version."); 
    } else { 
     console.log("Unknown error "+e+"."); 
    } 
    return; 
} 

}

큰 문제는 모든 테이블의 "ID"colums는 AUTO_INCREMENT 절 작동하지 않는다는 것입니다 ... 나는 그것이 작동 할 수 있습니까?

그렇지 않으면, 나는 (등등 데이터를 추가하기 위해 등) 테이블에 나에게 사용할 수있는 다음과 같은 ID를 알려주는 기능을하고있다 :

function nextIdInTableAvailable(tableName){ 

try { 
    console.log("entramos"); 

    var idNotAvailable = false; 
    var anId = 0; 
    console.log("entramos al while..."); 

    var db = getDb(); 

    while(idNotAvailable==false){ 

     console.log("toca vuelta " + anId); 
     var currentIdUsed = false; 

     db.transaction(function (tx){ 

       tx.executeSql('SELECT * FROM ' + tableName + ' WHERE id=? ORDER BY id ASC', [anId], function (tx, results) { 
        console.log("hay resultados en la vuelta " + anId); 
        currentIdUsed = true; 
       }); 

     }); 

     if(!currentIdUsed){ 
      idNotAvailable = true; 
      console.log("vamos a salir en la vuelta " + anId); 
     }else{ 
      anId = anId + 1; 
      console.log("seguimos en vuelta siguiente: " + anId); 
     } 

    } 


    console.log("El siguiente id disponible para la tabla '" + tableName + "' es: " + anId); 

    return anId; 

} catch(e) { 

    if (e == 2) { 
     // Version number mismatch. 
     console.log("Invalid database version."); 
    } else { 
     console.log("Unknown error "+e+"."); 
    } 

    return 0; 

} 

}

하지만, 다시 문제 : 트랜잭션이 비동기 적으로 실행되므로 반환 값이 바람직하지 않습니다 ...

auto_increment가 작동하지 않으면이 함수에 대한 해결책이 있습니까? 트랜잭션이 비동기 적으로 실행, 당신은 쉬운 방법의 값을 반환 할 수 없습니다

+0

이 AUTO_INCREMENT를 해결 : 모든 테이블의 문장을 만들 내가 오류가 있습니다. tx.executeSql ("tif.executeSql (ID INTEGER PRIMARY KEY AUTOINCREMENT, TEXT, descripcion_en TEXT, descripcion_es TEXT, descripcion_eu TEXT)", []); – russellhoff

답변

0

은, 그것은 나를 위해 작동 :

CREATE TABLE IF NOT EXISTS 'yourTableName' ('idPrimaryKey' INTEGER PRIMARY KEY ASC, 'column2' VARCHAR(45) NULL,'column3' TINYINT(1) NULL);