Использование синхронных операций базы данныхAdobe AIR 1.0 и более новых версий Код, используемый для выполнения операций и реагирования на них при синхронном выполнении, мало отличается от кода, используемого при режиме асинхронного выполнения. Существует два ключевых отличия одного подхода от второго. Первое отличие заключается в выполнении операции, которая зависит от другой операции (например, строки результатов, полученные посредством инструкции SELECT, или первичный ключ строки, добавленной при помощи инструкции INSERT). Второе отличие связано с обработкой ошибок. Написание кода для синхронных операцийКлючевым отличием синхронного выполнения от асинхронного является то, что код для синхронного режима представляет собой единую последовательность шагов. В асинхронном режиме, наоборот, регистрируются прослушиватели событий и операции часто распределяются по методам прослушивателей. Когда база данных подключена в синхронном режиме, можно выполнить несколько операций базы данных подряд в одном блоке кода. Следующий пример иллюстрирует такой подход: var conn:SQLConnection = new SQLConnection();
// The database file is in the application storage directory
var folder:File = File.applicationStorageDirectory;
var dbFile:File = folder.resolvePath("DBSample.db");
// open the database
conn.open(dbFile, OpenMode.UPDATE);
// start a transaction
conn.begin();
// add the customer record to the database
var insertCustomer:SQLStatement = new SQLStatement();
insertCustomer.sqlConnection = conn;
insertCustomer.text =
"INSERT INTO customers (firstName, lastName) " +
"VALUES ('Bob', 'Jones')";
insertCustomer.execute();
var customerId:Number = insertCustomer.getResult().lastInsertRowID;
// add a related phone number record for the customer
var insertPhoneNumber:SQLStatement = new 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();
Как вы видите, одни и те же методы вызываются для выполнения операций базы данных независимо от использования синхронного или асинхронного режима. Основными отличиями одного подхода от другого является выполнение операции, которая зависит от другой операции, и обработка ошибок. Выполнение операции, зависящей от другой операцииВ режиме синхронного выполнения нет необходимости составлять код, прослушивающий события, чтобы определить завершение операции. Вместо этого предполагается, что при успешном завершении операции в одной строке кода начинает выполняться операция в следующей строке. Следовательно, чтобы выполнить операцию, зависящую от успешного выполнения предыдущей операции, нужно написать зависимый код непосредственно после операции, от которой он зависит. Например, код приложения, включающий в себя начало транзакции, выполнение инструкции INSERT, получение первичного ключа вставленной строки, вставку первичного ключа в строку другой таблицы и фиксацию транзакции, может представлять собой последовательность инструкций. Следующий пример иллюстрирует эти операции: var conn:SQLConnection = new SQLConnection();
// The database file is in the application storage directory
var folder:File = File.applicationStorageDirectory;
var dbFile:File = folder.resolvePath("DBSample.db");
// open the database
conn.open(dbFile, SQLMode.UPDATE);
// start a transaction
conn.begin();
// add the customer record to the database
var insertCustomer:SQLStatement = new SQLStatement();
insertCustomer.sqlConnection = conn;
insertCustomer.text =
"INSERT INTO customers (firstName, lastName) " +
"VALUES ('Bob', 'Jones')";
insertCustomer.execute();
var customerId:Number = insertCustomer.getResult().lastInsertRowID;
// add a related phone number record for the customer
var insertPhoneNumber:SQLStatement = new 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 для устранения ошибок. Он построен на предыдущем примере с добавлением кода обработки ошибок: var conn:SQLConnection = new SQLConnection();
// The database file is in the application storage directory
var folder:File = File.applicationStorageDirectory;
var dbFile:File = folder.resolvePath("DBSample.db");
// open the database
conn.open(dbFile, SQLMode.UPDATE);
// start a transaction
conn.begin();
try
{
// add the customer record to the database
var insertCustomer:SQLStatement = new SQLStatement();
insertCustomer.sqlConnection = conn;
insertCustomer.text =
"INSERT INTO customers (firstName, lastName)" +
"VALUES ('Bob', 'Jones')";
insertCustomer.execute();
var customerId:Number = insertCustomer.getResult().lastInsertRowID;
// add a related phone number record for the customer
var insertPhoneNumber:SQLStatement = new 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:SQLError)
{
// rollback the transaction
conn.rollback();
}
|
|