2012-01-08 6 views
3

из кода учебник как этоткак я могу передать аргумент в функцию обратного вызова транзакции

function queryDB(tx) { 
    tx.executeSql('SELECT * FROM DEMO', [], querySuccess, errorCB); 
} 

function querySuccess(tx, results) { 

} 

function errorCB(err) { 
    alert("Error processing SQL: "+err.code); 
} 

var db = window.openDatabase("Database", "1.0", "PhoneGap Demo", 200000); 
db.transaction(queryDB, errorCB); 

в db.transaction я хочу передать переменную в качестве аргумента функции queryDB, поэтому код, который я думаю о том, должен выглядит например

db.transaction(queryDB(id), errorCB); 

Как я могу это реализовать? Или это просто будет работать так, и мой идентификатор будет передан и залезет в tx?

ответ

6

Заверните его в функции снова

var id = 'THEID'; 
db.transaction(function(){ 
    queryDB(id) 
}, errorCB); 

Примечание - Это при условии, что вы делаете в API. Некоторые API/фреймворки автоматически вставляют требуемую информацию. Например,

//the db.transaction method 
function transaction(param, callback) { 
    //do code stuff 
    callback(someInternalId); //callback is the function you pass as the first parameter 
} 

Итак, если вы хотите передать свои данные в обратном вызове, оберните его в функцию. В противном случае используемый вами код может сделать это автоматически.

+0

так же в queryDB() функцию я достану значение идентификационного tx.id? * Я работаю над телефонной связью – cjmling

+0

Как я уже сказал, это зависит от API phonegap (я его не использовал). это 'tx' значение, которое вы хотите передать в queryDB? или метод, который вы ожидаете от API-интерфейса (например, идентификатор транзакции). Если вы хотите передать его, вы можете использовать описанный выше метод. – JohnP

+0

'tx' может быть методом, который api заполнит, я думаю, http: //dev.w3.org/html5/webdatabase/#sqltransactioncallback .... так что если я хочу передать его тогда, то как я получаю значение ID .. это tx.id? – cjmling

2

Ok первую очередь создать класс шляпа будет обрабатывать вы Db экземпляры (дб обновления и т.д.) этот класс будет держать функцию, которая будет использоваться для всех вы запросов Query

self.db = window.openDatabase(// and so on 

то функция :

// execute a query and fetches the data as an array of objects 
self.executeQuery = function(string, args, callback, callbackparams) { 
    var self = this; 
    //console.log('db execute: '+string); 
    self.db.transaction(function(tx) { 
     tx.executeSql(string, args, function(tx, result) { 
      var retval = []; 
      for (var i = 0; i < result.rows.length; ++i) { 
       retval.push(result.rows.item(i)); 
      } 
      if (callback) { 
       callback(retval, result, callbackparams); 
      } 

     }, self.error); 
    }); 
} 

затем, когда вы начали, вы являетесь классом (я назвал его myDb) go apeshit!

myDb.executeQuery('select l.* from location l inner join item_location il on (il.location_id = l.id and il.item_id = ?)', [item.id], function(locations, res, item){ 
       item.locations = locations; 
       myDb.executeQuery('select * from media where item_id = ?', [item.id], function(media, res, item){ 
        item.media = media; 
        // create item. 
        createItem(item);      
       }, item); 
      }, item); 

, как вы можете видеть ExecuteQuery имеет 4 Params, запрос, Params для запроса, обратного вызова (с 3 Params, результат, статус и MyParam) MyParam (для обратного вызова)

Он принял мне немного времени, чтобы исправить это, но когда вы это сделали! не более раздражающий ужас db!

+0

спасибо за объяснение Рене, но можете ли вы объяснить, почему вы вызываете 2 вопроса? У вас есть простой пример? –

0

Мы не можем отправить любой paramenter для функции queryDB как «queryDB (ID)»

Я решил эту проблему таким образом.

var contactId = 33 
dbInst.transaction(function(tx){ 
    tx.executeSql('CREATE TABLE IF NOT EXISTS CONTACT_REFERENCE (id unique)'); 
    var sqlStr = 'INSERT INTO CONTACT_REFERENCE (id) VALUES (?)' 
    tx.executeSql(sqlStr, [contactId]); 
}, errorCB, successCB); 
0

Я думаю, что каждый приближается к ответу на ваш вопрос. На самом деле вам нужна небольшая модификация ответа JohnP. Вы должны передать объект SQLTransaction, который выполняет функцию executeSQL. Таким образом, чтобы построить на ответ Джона:

var id = 'THEID'; 
db.transaction(function(tx){ 
    queryDB(tx, id) 
}, errorCB); 

Затем вы определяете функцию, которую вы можете захватить ваш идентификатор параметров с дополнительной переменной.

queryDB: function (tx, id) { ...your code... } 
6

Мне нравится держать вещи очень простыми, поэтому я использую ограниченное количество функций при обращении с хранилищем в приложениях телефонной заставки, которые могут получать параметры. Многие примеры, которые я видел, имеют призывы ко многим вспомогательным функциям, и для меня это кошмар, когда дело доходит до отладки.

Я был пойман ряд проблем вокруг Web SQL, но, читая спецификации, действительно помог прояснить, что я мог и чего не мог сделать. (http://www.w3.org/TR/webdatabase/)

Посмотрите на этот простой код для вставки функции:

function dbInsert(param1, param2, dbObj) { 
    val1 = param1; 
    val2 = param2; 
    val3 = String(dbObj.item2); 

    var sqlTxt = "INSERT INTO demo (geo1, geo2, geo3) VALUES (?, ?, ?)"; 
    db.transaction(function(tx) {tx.executeSql(sqlTxt,[val1,val2,val3])}, errorCB, successCB); 
    } 

Давайте просто пройти через него. Очевидно, стандартная функция, которая получает параметры, которые могут быть чем угодно, в данном случае объект, а также строки.

sqlTxt где начинается самое интересное. Напишите это, как обычно, выписываете инструкцию insert, но где вы обычно должны вставлять/выбирать данные и т. Д. В ЗНАЧЕНИЯ используйте ? Заполнитель для каждого поля в таблицах базы данных, в которые вы хотите передать данные.

Теперь давайте ломаются следующую строку:

db.transaction(function(tx) {tx.executeSql(sqlTxt,[val1,val2,val3])}, errorCB, successCB); 

При создании новой базы данных, БД является обработчиком для объекта базы данных, поэтому db.transaction просит выполнить транзакцию на дб базы данных.

Если мы пишем следующий следующий раздел, как это вы можете увидеть это функция, которая вызывает tx.executeSql и потому, что в казнить внутри db.transaction метода , он будет передан в дб ручку.

function(tx) { 
    tx.executeSql(sqlTxt,[val1,val2,val3]) 
} 

Теперь, если мы должны были разобрать sqlTxt это может выглядеть следующим образом

INSERT INTO demo (geo1, geo2, geo3) VALUES ('a', 'b', 'c'); 

и потому, что мы проходим три переменные вместо ? держатель, похоже, линия выше. И, наконец, вы вызываете ошибки и функции обратного вызова успеха.

В вашем случае я хотел бы создать функцию queryDB так:

function queryDB(id) { 
    var sqlTxt = "SELECT * FROM DEMO WHERE id=?" 
    db.transaction(function(tx) {tx.executeSql(sqlTxt,[id])}, errorCB, successCB); 
} 

В сущности, функция захватывает идентификатор параметра, передает его в запрос в [ID] и выполняется и возвращает ошибку или успех , Очевидно, вы можете расширить это, чтобы использовать несколько параметров, или если вы хотите быть действительно умными, вы просто создаете единую транзакционную функцию базы данных и передаете в sql и параметры для использования в качестве объекта или массива (пример будет в моем блоге в эти выходные)

0

Это обработанное решение:

var sqltxt= 'INSERT INTO CONTACTS(id, data) VALUES (?, ?)'; 
    var db = window.openDatabase("Database", "1.0", "Demo", 200000); 
    db.transaction(function(tx){tx.executeSql('DROP TABLE IF EXISTS CONTACTS'); 
      tx.executeSql('CREATE TABLE IF NOT EXISTS CONTACTS(name unique, password)'); 

      tx.executeSql(sqltxt,[name, pass]); 

    }, errorCB, successCB); 
Смежные вопросы