8

Phonegap を使用すると、データベース トランザクション全体または個々の SQL ステートメントでエラーが発生した場合にコールバックされる関数を設定できます。エラーに関する詳細情報を取得する方法を知りたいです。

1 つの一般的なエラー処理関数と、それをトリガーする可能性のあるさまざまな SELECT または INSERT があります。どちらが間違っていたのか、どうすればわかりますか? エラー メッセージから常に明らかであるとは限りません。

これまでの私のコードは...

function get_rows(tx) {
   tx.executeSql("SELECT * FROM Blah", [], lovely_success, statement_error);
}
function add_row(tx) {
   tx.executeSql("INSERT INTO Blah (1, 2, 3)", [], carry_on, statement_error);
}
function statement_error(tx, error) {
   alert(error.code + ' / ' + error.message);
}

さまざまな例から、エラー コールバックにtransactionオブジェクトとオブジェクトが渡されることがわかりerrorます。.code次の値を持つことができると読みました:

  • UNKNOWN_ERR = 0
  • データベース_エラー = 1
  • バージョン_エラー = 2
  • TOO_LARGE_ERR = 3
  • QUOTA_ERR = 4
  • SYNTAX_ERR = 5
  • CONSTRAINT_ERR = 6
  • タイムアウト_エラー = 7

エラーオブジェクトの他のプロパティ/メソッドはありますか?
この時点でのトランザクション オブジェクトのプロパティ/メソッドは何ですか?

これに関する適切なオンライン参照が見つからないようです。確かにPhonegapのウェブサイトにはありません!

4

2 に答える 2

11

http://docs.phonegap.com/en/2.2.0/cordova_storage_storage.md.html#SQLError

データベースの操作中にエラーが発生すると、SQLErrorオブジェクトがスローされます。

このオブジェクトには2つのプロパティがあります。

  • コード(記述された定数の1つ)
  • メッセージ:エラーの説明。

したがって、コードerror.message内で、どのトランザクションで何がうまくいかなかったかについての適切な説明が得られます。

まさにそれがあなたの望みだと思いますね。

よろしく、F481

于 2012-12-14T14:32:14.223 に答える
3

トランザクションオブジェクト

.executeSql()トランザクションオブジェクトでできることは、私が確認できる限り、そのメソッドを呼び出すことだけです。このオブジェクトのプロパティが見つかりません。

エラーオブジェクト

エラーオブジェクトには.code、数値を含むプロパティがあります。数値を確認するか(上記の私の元の質問を参照)、次のようなものを使用できます。
if (error.code == error.DATABASE_ERR) alert('nasty database error')

プロパティは文字列であり、次の.messageようなものを返す場合があります。

  • ステートメントを準備できませんでした(「wibble」の近くに1つ:構文エラー)
  • ステートメントを準備できませんでした(1そのようなテーブルはありません:MyyTable)
  • ステートメントを準備できませんでした(1つのテーブルMyTableにMyColunmという名前の列がありません)
  • ステートメントを実行できませんでした(19個の制約が失敗しました)

他のメッセージも可能です!これは、Chromeでデバッグするときに私が見つけたほんの数例です。Phonegapで、メッセージが短くなっていることに気付きました。「そのようなテーブルはありません:MyyTable

成功/エラーコールバックの2つのセットがあります

また、への最初の呼び出しで別のデータベースエラーコールバックがあることに注意してください.transaction()。関数にはエラーオブジェクトのみが返されます(トランザクションオブジェクトは返されません)。

エラー.codeはゼロになり、.messageステートメントコールバックが例外を発生させたか、ステートメントエラーコールバックがfalseを返さなかった」になります。

したがって、ステートメントコールバック(.executeSql元の質問のコード例の私のstatement_errorなどの内部で言及されている関数)が、トランザクションエラーコールバック(内部で言及されている2番目の関数.transaction)をヒットするかどうかに応じてtrueまたはfalseを返すようにすることを忘れないでください。指定した「success」コールバック(3番目のコールバック.transaction)は、trueを返す(または何も返さない)場合に実行されます。

于 2012-12-19T11:02:15.657 に答える