Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

DBMS (СУБД) API

From Wiki
Jump to: navigation, search
Article Metadata

Статья
Перевод:
Оригинал: DBMS
truf
Последнее редактирование: hamishwillee (09 Dec 2011)


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.


Ссылки

This page was last modified on 9 December 2011, at 02:07.
237 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×