How to show useful error messages from a database error callback in Phonegap?

cordova, database, error-handling

Solution

Transaction object

The only thing you can do with the transaction object is call its `.executeSql()` method, as far as I can ascertain. I cannot find any properties of this object.

Error object

The error object has a `.code` property which contains a number. You can either check the numerical value (see my original question above) or use something like: `if (error.code == error.DATABASE_ERR) alert('nasty database error')`

The `.message` property is a string and may return something like this:

- could not prepare statement (1 near "wibble": syntax error)

- could not prepare statement (1 no such table: MyyTable)

- could not prepare statement (1 table MyTable has no column named MyColunm)

- could not execute statement (19 constraint failed)

Other messages are possible! This is just the few I spotted when debugging in Chrome. I notice in Phonegap the messages are briefer: "no such table: MyyTable"

There are two sets of success/error callbacks

Also note that there is another database error callback on the initial call to `.transaction()`. Your function will only be returned an error object (no transaction object).

The error's `.code` will be zero and the `.message` will be "the statement callback raised an exception or statement error callback did not return false".

So remember to have your statement callbacks (function mentioned inside `.executeSql` such as my statement_error in the code example of my original question) return true or false depending on whether you want your transaction error callback (second function mentioned inside `.transaction`) to be hit. The 'success' callback you specified (third one inside `.transaction`) will be run if you return true (or don't return anything).

Problem

Using Phonegap you can set a function to be called back if the whole database transaction or the individual SQL statement errors. I'd like to know how to get more information about the error. I have one generic error-handling function, and lots of different SELECTs or INSERTs that may trigger it. How can I tell which one was at fault? It is not always obvious from the error message. My code so far is... ``` 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); } ``` From various examples I see the error callback will be passed a `transaction` object and an `error` object. I read that `.code` can have the following values: - UNKNOWN_ERR = 0 - DATABASE_ERR = 1 - VERSION_ERR = 2 - TOO_LARGE_ERR = 3 - QUOTA_ERR = 4 - SYNTAX_ERR = 5 - CONSTRAINT_ERR = 6 - TIMEOUT_ERR = 7 Are there any other properties/methods of the error object? What are the properties/methods of the transaction object at this point? I can't seem to find a good online reference for this. Certainly not on the Phonegap website!

Original source