0

ドキュメントによると、データベースを作成して次のものを入力できます。

 // PhoneGap is ready
//
function onDeviceReady() {
    db = window.openDatabase("Database", "1.0", "PhoneGap Demo", 200000);
    db.transaction(populateDB, errorCB, successCB);
    //accessToken=new Table('Token','id unique, tokenType, tokenValue');
    ///createTable(accessToken);
}


 // Populate the database

function populateDB(tx) {
     tx.executeSql('DROP TABLE IF EXISTS DEMO');
     tx.executeSql('CREATE TABLE IF NOT EXISTS DEMO (id unique, data)');
     tx.executeSql('INSERT INTO DEMO (id, data) VALUES (1, "First row")');
     tx.executeSql(
            'INSERT INTO '+tname+' (id,data) VALUES (?, ?);',
            [id,data],
            function (transaction, resultSet) {
             //success code
             alert('sucessful insertion');
             },
             errorCB
        );
}

// Transaction error callback
//
function errorCB(err) {
    alert("Error processing SQL: "+err);
}

// Transaction success callback
//
function successCB() {
    alert("success!");
}

ただし、行 db.transaction(populateDB, errorCB, successCB); で populateDB コールバックに引数を渡すことは可能ですか? ? もしそうなら、どうすればその引数の値にアクセスできますか? 例を挙げてください。これで何か助けていただければ幸いです。

4

3 に答える 3

0

「db.transaction(populateDB(somestuff)、successCB、errorCB);」のpopulateDBに引数を送信することはできません。

トランザクションメソッドはtx変数に置き換えられます。ここでソースコードを参照してください:https ://github.com/apache/incubator-cordova-js/blob/master/lib/android/plugin/android/storage.js

解決策はこのリンクで提供されています:

https://stackoverflow.com/a/14988487/905511

于 2013-02-20T19:42:35.897 に答える
0

上記のコード例は少しファンキーに見えます。まず、tx.executeSql 関数に JavaScript 関数があるようです。これは不可能です。

docs.phonegap.com の例を次に示します。

function populateDB(tx) {
 tx.executeSql('DROP TABLE IF EXISTS DEMO');
 tx.executeSql('CREATE TABLE IF NOT EXISTS DEMO (id unique, data)');
 tx.executeSql('INSERT INTO DEMO (id, data) VALUES (1, "First row")');
 tx.executeSql('INSERT INTO DEMO (id, data) VALUES (2, "Second row")');
}

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

function querySuccess(tx, results) {
console.log("Returned rows = " + results.rows.length);
// this will be true since it was a select statement and so rowsAffected was 0
if (!resultSet.rowsAffected) {
  console.log('No rows affected!');
  return false;
}

var db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000);
db.transaction(populateDB, errorCB, querySuccess);

コールバックの結果は、コールバック関数の tx および results パラメータに渡されます。

質問の 2 番目の部分であるコールバックへのアクセス方法については、コールバック システムがどのように機能するかを理解するのに役立ちます。基礎となるデバイスへの呼び出しを行う前に、PG は呼び出しの識別子を作成し、成功およびエラーのコールバックへの参照を保存します。次に、ネイティブ システムを呼び出すときに、実際の callbacks ではなく識別子を渡します。

ネイティブ呼び出しが成功すると、cordova.successcallback が webview に書き込まれ、以前に作成した識別子が渡されます。失敗した場合、cordova.failurecallback が書き込まれ、同じ識別子が渡されます。

ここでgithub の JavaScript ソースを確認することを強くお勧めします。より具体的には、ターゲットにしている特定のプラットフォームの exec.js ファイルを確認することを強くお勧めします。コールバック システムがどのように機能するかについてのより良い洞察が得られます。

于 2012-09-19T13:17:28.340 に答える
0

短い答えはノーです。あなたが試したように直接ではありません。

パラメータを受信できる phonegap アプリケーションでストレージを処理するときは、定義済みの関数をいくつか使用します。私が見た多くの例には、多くのサブ関数への呼び出しがあり、デバッグに関しては、これは悪夢です。

私は Web SQL に関する多くの問題に遭遇しましたが、実際に仕様を読むことで、自分にできることとできないことを明確にすることができました。( http://www.w3.org/TR/webdatabase/ )

このコードを見てください:

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

    var sql = "INSERT INTO DEMO (col1, col2, col3) VALUES (?, ?, ?)";
    db.transaction(function(tx) {tx.executeSql(sql, [val1, val2, val3])}, errorCB, successCB);
}

したがって、この関数は 2 つの文字列パラメーターと、私が作成したダミー オブジェクトを受け取ります。これらは SQL 文字列に組み込まれ、tx.executeSql に渡されて実行されます。私が使用していることに注意してください ? リテラルの代わりに、[] 内のパラメーターを介して送信されます。トランザクション メソッド内で tx.executeSql を実行しています。これは、トランザクション メソッドを単独で実行でき、コールバックを引き続き処理できることを意味します。

あなたの例では、私はこれを行います:

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

    var sql = "INSERT INTO DEMO (col1, col2, col3) VALUES (?, ?, ?)";
    db.transaction(function(tx) {tx.executeSql(sql, [val1, val2, val3])}, errorCB, successCB);
}

function populateDB(tx) {
    tx.executeSql('DROP TABLE IF EXISTS DEMO');
    tx.executeSql('CREATE TABLE IF NOT EXISTS DEMO (id unique, data)');
    tx.executeSql('INSERT INTO DEMO (id, data) VALUES (1, "First row")');
    dbInsert('AAA', 'BBB', 'CCC');
}
于 2013-04-19T09:26:31.753 に答える