2014-01-07 3 views
-1

я пытаюсь создать реляционную базу данных, используя полокоть в Java Script, но я столкнулся с некоторыми трудностями, это код, она работает ДО Я ИЗМЕНИТЬ ЕГО ООПреляционных баз данных и OOP Javascript

function DB() { 
this.size; 
this.row; 

this.getsize = function() { 
    return this.size; 
} 

this.db = window.openDatabase('coupons', "1.0", 'database for coupons', 100000); 
this.al = function() { 
    alert('al works'); 
} 
this.add = function(table, id, name, email, fav) { 
    // alert("works"); 
    // alert("INSERT INTO " + table + " VALUES(" + id + "," + name + ")"); 
    this.db.transaction(function(ob) 
    { 
     ob.executeSql("SELECT * FROM " + table + " WHERE pid= " + id + "", [], this.dataHandler, this.errorHandler); 

    }); 
    this.db.transaction(function(ob) 
    { 
     //alert(getsize()); 
     if (this.size > 0) { 
      alert("user already exists") 
     } else { 
      ob.executeSql("CREATE TABLE IF NOT EXISTS " + table + " (pid INTEGER, pname TEXT, pemail TEXT,pfav)"); 
      ob.executeSql("INSERT INTO " + table + " VALUES(" + id + "," + "'" + name + "'" + "," + "'" + email + "'" + "," + "'" + fav + "'" + ")"); 
      alert("user addd successfuly"); 
     } 
    } 
    ); 
} 
this.errorHandler = function(error) 
{ 
    document.write("handling error " + error); 
} 
this.dataHandler = function(transaction, data) 
{ 
    // document.write("<table>"); 
    //document.write("<tr><th>id</th><th>name</th></tr>") 
    // size = data.rows.length; 
    //for(i=0;i<size;i++) 
    // { 

    //Variables.call(this,data.rows.length,data.rows.item(0)); 
    //Variables.call(7,6); 

    this.size = data.rows.length; 
    this.row = data.rows.item(0); 






    //return row; 
    //  document.write(
    //  "<tr><td>"+row['pid']+"</td><td>"+row['pname']+"</td></tr>"); 
    // } 
    //document.write("</table>"); 
} 

this.getrows = function(n) 
{ 
    switch (n) 
    { 
     case 'pid': 
      return this.row['pid']; 
      break; 
     case 'pname': 
      return this.row['pname']; 
      break; 
     case 'pemail': 
      return this.row['pemail']; 
      break; 
     case 'pfav': 
      return this.row['pfav']; 
      break; 
     default: 
    } 
} 

}

проблема заключается в следующем, надеюсь, что вы можете мне помочь! 1. После вызова функции add, она не переходит к функции dataHandler. 2. в функции добавления я не могу использовать локальные переменные, как я могу использовать переменную 'size', чтобы проверить, существует ли пользователь в базе данных или нет? !! , надеюсь, что вы можете помочь мне был в этом коде на 2 дня !!! :(

ответ

1

Да, вы, очевидно, не можете получить доступ к this.size в своей функции, потому что используете анонимную функцию, так что это не связано с вашим DB-объектом, но указывает на эту анонимную функцию. То же самое для вашего . вызовы this.dataHandler или this.errorHandler Таким образом, вы могли бы просто

this.db.transaction = function(ob) 

сделать это метод вашего объекта, который затем даст вам полный доступ к этому - указатель вашей БД -. объект EDIT : Извините, это тогда указывало бы на объект db, конечно, так что это не решение. Но вы можете передать ему свои данные - и errorHandler вот так:

this.db.transaction(function() { ... }, this.errorHandler, this.dataHandler); 

и избежать вызова this.size во второй сделке - заявление просто оборачивать ваш звонок как:

if(this.size > 0) { alert('..'); } else { db.transaction(...) } 

Но: Ваш ErrorHandler и DataHandler фактически должен соответствовать нужному интерфейсу - Определения , взгляните на: http://www.w3.org/TR/2009/WD-html5-20090212/structured-client-side-storage.html

+0

thx man !! теперь все ясно. Я взял ваш совет, и он отлично работает :) –

Смежные вопросы