DBMS (СУБД) API
Метаданные
Contents |
Введение
DBMS (Database Menagement System) API - Система Управления Базами Данных (СУБД). DBMS предоставляет функции для создания и управления базами данных (БД), а также обеспечивает надежный и защищенный доступ к этим данным как с помощью C++ функций и так и с помощью SQL запросов. Запросы в DBMS поддерживают механизм транзакций. Благодаря механизму транзакций вы можете быть уверены, что все вносимые вами изменения будут исполнены, или ни одно из них не вступит в силу.
DBMS в Symbian OS является мощной, но не ресурсоемкой системой. Она поддерживает как язык запросов SQL, так и язык определения данных DDL. Встроенные C++ функции предоставляют функциональность для добавления, поиска, извлечения, изменения и удаления записей.
Создание базы данных
Создание Базы данных с помощью RDbStoreDatabase Следующий пример кода демонстрирует создание базы данных с помощью RDbStoreDatabase. В нем создается объект File Store (файловое хранилище данных) и БД в нем.
class CBookstoreDb : public CBase
{
...
private: // Члены класса
RFs iFsSession;
RDbStoreDatabase iBookstoreDb;
CFileStore* iFileStore;
...
};
TInt CBookstoreDb::CreateDbL(const TFileName& aNewBookstoreFile)
{
User::LeaveIfError(iFsSession.Connect());
// Создаем новый или заменяем существующий файл
iFileStore = CPermanentFileStore::ReplaceL(iFsSession,
aNewBookstoreFile, EFileRead|EFileWrite);
iFileStore->SetTypeL(iFileStore->Layout());
TStreamId id = iBookstoreDb.CreateL(iFileStore);
iFileStore->SetRootL(id); //Поместим id базы данных в корень хранилища
iFileStore->CommitL(); //Подтверждаем изменения в хранилище
... // Теперь БД открыта и готова к операциям с ней.
Примечание: Функция CreateDbL создает новый файл базы данных. Она принимает аргумент типа TFileName, содержащий абсолютное (включая путь) имя файла. В примере, любой существовавший файл с таким именем будет перезаписан функцией ReplaceL(). В конце примера создается root stream (корневой поток) объект и изменения структуры базы данных подтверждаются.
Создание базы данных с помощью RDbNamedDatabase
Следующий пример кода демонстрирует создание базы данных с помощью RDbNamedDatabase. Этот пример более простой, поскольку отсутствует необходимость работы с потоками:
...
RFs iFsSession;
RDbNamedDatabase iBookstoreDb;
...
TInt CBookstoreDb::CreateDbL(const TFileName& aNewBookstoreFile)
{
User::LeaveIfError(iFsSession.Connect());
// Create new or replace existing database
User::LeaveIfError(iBookstoreDb.Replace(fsSession,
aNewBookstoreFile));
... // База данных открыта. Создаем таблицы и т.д.
Примечание: Метод Replace создаст новый файл базы данных или заменит существующий. В файле создается пустая база данных. После этого база данных открывается и готова к созданию таблиц, индексов и пр. При создании базы данных, клиент получает исключающие права доступа к ней (доступ др. клиентов блокируется). Функция Replace принимает аргумент типа TFileName, содержащие полное имя файла (вместе с путем).
В Symbian OS DBMS, длина имя базы данных DBMS ограничена 64 символами. Имя базы данных соответствует имени файла, в котором она создана. Использование расширения в имени файла не обязательно. К примеру, следующие имена правильны:
_LIT(KDbName,"C:\\system\\apps\\bookstoredb\\bookstore.dat");
_LIT(KDbName,"C:\\system\\apps\\bookstoredb\\bookstore");
Создание таблиц в базе данных
Для создания таблицы, разработчик должен быть знаком с тремя ключевыми понятиями: атрибут (столбец таблицы), множество атрибутов и индексный ключ. Индексный ключ инкапсулирован в CDbKey. Ключевой атрибут таблицы инкапсулирован в TDbKeyCol. Определение атрибута в TDbCol.
Схема базы данных
DBMS предоставляет функции для доступа к структуре базы данных (индексам, таблицам и пр.). Базовый класс базы данных RdbDatabase содержит следующие функции:
• TableNamesL(): Список имен всех таблиц, инкапсулированных в CDbTableNames.
• IndexNamesL(): Список имен всех индексов, инкапсулированных в CDbIndexNames. В качестве аргумента требует имя таблицы.
• ColSetL(): Определение столбцов таблицы, инкапсулированных в CDbColSet. В качестве аргумента требует имя таблицы.
• KeyL(): Определение индексного ключа для индекса таблицы. Метод принимает в качестве аргументов имена таблицы и индекса. Определения столбцов CDbColSet таблицы также могут быть получены из таблицы или ее отображения с помощью метода их базового класса RdbRowSet::ColSetL(). Переход от записи к записи в CdbColSet осуществляется с помощью методов этого же класса, либо с помощью класса TdbColSetIter.
Открытие и закрытие базы данных
База данных может быть открыта с исключающими (exclusive) правами (режим одного клиента) или с разделенными (shared) правами (клиент-серверный режим). RDbNamedDatabase поддерживает оба режима, а RDbStoreDatabase позволяет открыть базу только в режиме одного клиента.
Рекомендуется использовать RDbNamedDatabase API. Доступ в режиме одного клиента немного быстрее, но в этом случае база окажется недоступной для других программ, т.к. файл базы данных будет заблокирован. Для большинства случаев рекомендуется использовать доступ в клиент-серверном режиме.
Создание данных
Создание новой записи в таблице базы данных включает в себя следующие шаги: добавление пустой записи, изменение данных в ней и подтверждение внесенных изменений. table.InsertL() добавляет новую запись, а table.SetCol(...) позволяет изменить в ней данные. Если типом столбца является EDbColLongText8, EDbColLongText16 или EDbColLongBinary - то для изменения данных в нем следует использовать RDbColWriteStream.


(no comments yet)