1

HTML5とWebデータベースストレージを使用してアプリケーションを開発しています。

テーブルに行を挿入し、以下を使用して作成された新しいID(テーブルの主キー)を返したい。

function insertIntoTable(title, text, sketchFileName, categoryId)
{
    var db = window.openDatabase('xxx', '1.0', 'xxx database', 5*1024*1024);
    var returnedId = -1;
    db.transaction(
        function (tx) {
            if (sketchFileName == '')
            {
                tx.executeSql('INSERT INTO TableXXX (title, content, created, categoryID) VALUES (?, ?, ?, ?)', 
                            [title, text, Date.now(), categoryId], 
                            function (transaction, resultSet) {
                                if (resultSet.rowsAffected) {
                                    returnedId = resultSet.insertId;
                                }
                            }, handleSQLError);
            }
        }, handleSQLError);
    );

    return returnedId;
}

しかし、私は常に-1を取得します。Safari開発モードを使用してテーブルに新しい行が表示されます。

何かアドバイス?

4

1 に答える 1

1

returnsIdの宣言を関数の外部に移動してから関数を2回呼び出すと、戻り値が最初の挿入のIDであることがわかり、設定されています。データベースが非同期であるため、関数が戻った後にidが設定されているように見えます。これは理にかなっています。

W3C仕様によると、openDatabaseの代わりに使用できるopenDatabaseSyncがあるはずですが、Safari(5.0.1)でそれを機能させることができませんでした。

明らかに、投稿したスニペットの外でコードがどのように見えるかはわかりませんが、値を返す必要がなく、代わりにコールバックで返されたIDを管理できるように、コードをリファクタリングできることを願っています。

于 2011-08-30T15:19:06.717 に答える