同期実行を使用する場合に操作の実行や応答のために使用する実際のコードは、非同期実行モードのコードとほとんど変わりません。この 2 つのアプローチの主な違いは 2 つの領域に分類できます。1 つは別の操作に依存する操作の実行(
SELECT
の結果行や、
INSERT
ステートメントによって追加された行の主キーなど)、もう 1 つはエラー処理です。
同期操作のためのコードの記述
同期実行と非同期実行の主な違いとして、同期モードではコードを一続きのステップとして記述するのに対し、非同期コードではイベントリスナーを登録し、たいていは操作を複数のリスナーメソッドに分割します。データベースが
同期実行モードで接続されている
場合は、一連のデータベース操作を 1 つのコードブロックで連続して実行できます。次の例は、この方法を示しています。
// Include AIRAliases.js to use air.* shortcuts
var conn = new air.SQLConnection();
// The database file is in the application storage directory
var folder = File.applicationStorageDirectory;
var dbFile = folder.resolvePath("DBSample.db");
// open the database
conn.open(dbFile, air.OpenMode.UPDATE);
// start a transaction
conn.begin();
// add the customer record to the database
var insertCustomer = new air.SQLStatement();
insertCustomer.sqlConnection = conn;
insertCustomer.text =
"INSERT INTO customers (firstName, lastName) " +
"VALUES ('Bob', 'Jones')";
insertCustomer.execute();
var customerId = insertCustomer.getResult().lastInsertRowID;
// add a related phone number record for the customer
var insertPhoneNumber = new air.SQLStatement();
insertPhoneNumber.sqlConnection = conn;
insertPhoneNumber.text =
"INSERT INTO customerPhoneNumbers (customerId, number) " +
"VALUES (:customerId, '800-555-1234')";
insertPhoneNumber.parameters[":customerId"] = customerId;
insertPhoneNumber.execute();
// commit the transaction
conn.commit();
この例からわかるように、同期実行と非同期実行のどちらを使用する場合も、データベース操作を実行するために呼び出すメソッドは同じです。この 2 つのアプローチの主な違いは、別の操作に依存する操作の実行とエラー処理にあります。
別の操作に依存する操作の実行
同期実行モードを使用する場合は、操作の完了を確認するためにイベントをリッスンするコードを記述する必要はなく、コードの前の行の操作が正常に完了するとコードの次の行が実行されるものと考えることができます。したがって、別の操作の成功に依存する操作を実行するには、その操作のコードを依存する操作の直後に記述するだけで済みます。例えば、アプリケーションでトランザクションを開始して、
INSERT
ステートメントを実行し、挿入した行の主キーを取得して、その主キーを別のテーブルの別の行に挿入した後、最後にトランザクションをコミットするコードを記述する場合、これらすべてのコードを一続きのステートメントとして記述できます。これらの操作を実行する例を以下に示します。
// Include AIRAliases.js to use air.* shortcuts
var conn = new air.SQLConnection();
// The database file is in the application storage directory
var folder = File.applicationStorageDirectory;
var dbFile = folder.resolvePath("DBSample.db");
// open the database
conn.open(dbFile, air.OpenMode.UPDATE);
// start a transaction
conn.begin();
// add the customer record to the database
var insertCustomer = new air.SQLStatement();
insertCustomer.sqlConnection = conn;
insertCustomer.text =
"INSERT INTO customers (firstName, lastName) " +
"VALUES ('Bob', 'Jones')";
insertCustomer.execute();
var customerId = insertCustomer.getResult().lastInsertRowID;
// add a related phone number record for the customer
var insertPhoneNumber = new air.SQLStatement();
insertPhoneNumber.sqlConnection = conn;
insertPhoneNumber.text =
"INSERT INTO customerPhoneNumbers (customerId, number) " +
"VALUES (:customerId, '800-555-1234')";
insertPhoneNumber.parameters[":customerId"] = customerId;
insertPhoneNumber.execute();
// commit the transaction
conn.commit();
同期実行でのエラー処理
同期実行モードでは、操作の失敗を確認するためにエラーイベントをリッスンする代わりに、エラーをトリガーする可能性があるコードを
try..catch..finally
コードブロックで囲みます。エラーをスローするコードを
try
ブロックでラップし、それぞれの種類のエラーに対して実行するアクションを個別の
catch
ブロックに記述して、操作が成功したか失敗したかに関係なく常に実行するコード(不要になったデータベース接続を閉じるコードなど)を
finally
ブロックに配置します。エラー処理のために
try..catch..finally
ブロックを使用する例を以下に示します。この例は、前の例にエラー処理のコードを追加したものです。
// Include AIRAliases.js to use air.* shortcuts
var conn = new air.SQLConnection();
// The database file is in the application storage directory
var folder = File.applicationStorageDirectory;
var dbFile = folder.resolvePath("DBSample.db");
// open the database
conn.open(dbFile, air.SQLMode.UPDATE);
// start a transaction
conn.begin();
try
{
// add the customer record to the database
var insertCustomer = new air.SQLStatement();
insertCustomer.sqlConnection = conn;
insertCustomer.text =
"INSERT INTO customers (firstName, lastName)" +
"VALUES ('Bob', 'Jones')";
insertCustomer.execute();
var customerId = insertCustomer.getResult().lastInsertRowID;
// add a related phone number record for the customer
var insertPhoneNumber = new air.SQLStatement();
insertPhoneNumber.sqlConnection = conn;
insertPhoneNumber.text =
"INSERT INTO customerPhoneNumbers (customerId, number)" +
"VALUES (:customerId, '800-555-1234')";
insertPhoneNumber.parameters[":customerId"] = customerId;
insertPhoneNumber.execute();
// if we've gotten to this point without errors, commit the transaction
conn.commit();
}
catch (error)
{
// rollback the transaction
conn.rollback();
}
|
|
|