S60_DBMS_APIs中文版

  • 格式:pdf
  • 大小:376.85 KB
  • 文档页数:22

S60_DBMS_APIs 1. Introduction 2. DBMS structure and elements 2.1 Permanent file stores and streams 2.2 Create a database 2.3 Define tables within a database 2.3.1 Columns 2.3.2 Column sets 2.3.3 Index keys 2.4 Query schema information 2.5 Open and close a database 2.6 Create data 2.6.1 Long column data in a database 3. Using RowSets and cursors 3.1 RowSet definition 3.1.1 RowSet base 3.1.2 Table RowSets 3.1.3 SQL views 3.2 Cursors 3.2.1 Cursor states 3.3 Retrieving data by index 4. Using SQL with DBMS 4.1 SQL and the native C++ API 4.2 Breakdown of a Select statement 4.3 Supported SQL subset 4.4 Using TDbQuery class 4.5 SQL schema and data updates 4.5.1 Database Definition Language (DDL) 4.5.2 SQL data update statements (DML) 4.5.3 Examples 5. Incremental database operations 5.1 Overview 5.2 Database incremental operations — RDbIncremental 5.3 DML statement incremental execution — RDbUpdate 5.3.1 DML synchronous 5.3.2 DML asynchronous 6. Sharing databases 6.1 DBMS server session 6.2 Database change notifier 6.3 Transactions and locks 1.介绍 这篇文档介绍了Symbian OS中怎样有效使用关系数据库API,即DBMS API。 Symbian OS提供了创建和维护数据库的功能,并实现了通过本地和SQL可靠安全访问数据库的方法。SQL调用支持事务和回滚机制,这就保证了数据全写或全部未写。

2.数据库结构和元素 Symbian OS DBMS提供了一个关系数据库的功能接口。所有Symbian OSDBMS都具有一个元素层次:最顶端的是包含数据库的文件存储,它包含表。表是由列定义的,由行组成的。列是由数据类型和长度定义的,DBMS支持一个丰富的数据类型。

开发者过去使用的非DBMS数据库环境,比如ISAM,行可以被认为是记录,列类似域。但是,需要指出的是,在DBMS中,行和列都具有除了记录和域之外的其他属性。

Symbian OS DBMS是一个功能强大的,轻量级的实现,它支持使用SQL,DDL(Data Definition Language),DML(Data Modeling Language)进行常用的增加、查询、获取、更新和删除操作。尽管是轻量级,Symbian OS DBMS给手持设备使用者提供了适用的功能,数据库大小也仅仅局限于可用资源。

2.1永久性文件存储和流 Symbian OS DBMS依赖文件服务器,永久文件存储和流的实现。在Symbian OS中,文件存储和流是非常相近的。

通常理解,文件存储字面意义上讲,就是磁盘上的文件,一个文件在目录列表中拥有一个可见的名字。但是文件的实现决定了它的内容和意图并不能在“视图”中表示。

流是典型的向/从一个存储进行内化/外化的对象,一个存储可以理解成流的集合。 永久文件存储实现了一种典型类型,它当中的流可以被个别改变,而不是使用其他存储类型一次性替换。网络对象包含的应用程序数据被结构化,以便是数据修改时可以加载或写入,RAM经常是用以改变的媒介。

永久文件存储使用类CPermanentFileStore,它继承自CFileStore,这些类在文件存储API中定义。这种存储实现了存储虚框架中大部分功能,最重要的是,永久存储中的流可以: * 预先被创建 * 重写 * 替换 * 删除

2.2 创建数据库 有两个API可以用来创建数据库: 1. RDbStoreDatabase 提供了专有的创建和打开数据库的接口,这样的数据库是不能共享的,数据库以文件的形式存在,所以它又称为客户端访问。 2. RDbNameDatabase 提供了用名字和格式标识的创建和打开数据库的接口,这个类允许客户端(专有)和服务的共享数据库访问。 不管是哪种数据库,数据库都是建立在文件上的。在创建阶段,两种API都需要以专有模式使用RFs文件服务器会话,如果数据库需要被共享,就必须使用RDbNameDatabase来创建和关闭数据库,最后使用数据库服务器会话类RDbs来打开数据库。

在使用数据库时,首选RDbNameDatabase。 使用RDbStoreDatabase创建数据库 class CBookDb : public CBase { ... private: // Member data RFs iFsSession; RDbStoreDatabase iBookDb; CFileStore* iFileStore; ... };

TInt CBookDb::CreateDb(const TFileName& aNewBookFile) { Close(); // Create empty database file. TRAPD(error, iFileStore = CPermanentFileStore::ReplaceL(iFsSession, aNewBookFile, EFileRead|EFileWrite); iFileStore->SetTypeL(iFileStore->Layout());// Set file store type TStreamId id = iBookDb.CreateL(iFileStore);// Create stream object iFileStore->SetRootL(id);// Keep database ID as root of store iFileStore->CommitL();// Complete creation by committing // Create Book tables and indexes CreateBooksTableL(); CreateBooksIndexL(); );

使用RDbNameDatabase创建数据库 使用RDbNameDatabase创建数据库更简单,因为无需使用流。 ... RFs iFsSession; RDbNamedDatabase iBookDb; ...

TInt CBookDb::CreateDb(const TFileName& aNewBookFile) { Close(); TInt error=iBookDb.Replace(iFsSession, aNewBookFile); if(error!=KErrNone) { return error; } ...// Database is now open. Create tables etc. }

Replace方法创建一个新数据库或替换现有数据库,它会将数据库文件置空,然后数据库就是打开状态,并为后面的建表做好了准备。注意,通过创建数据库,现在的访问模式是专有的。Replace方法中的TFileName为文件全称(包含路径)。

在Symbian OS DBMS中,数据库名字长度被限制为不超过64个字符。数据库名字跟文件名字相对应,这取决于程序员是否在文件上使用扩展名,下面是几个合法的名字: _LIT(KDbName,"C:\\system\\apps\\DBMS\\DBMS.dat"); _LIT(KDbName,"C:\\system\\apps\\DBMS\\DBMS");

在S60第三版上的合法路径和名字: Application private path: _LIT(KDbName,"C:\\Private\\\\DBMS.dat"); _LIT(KDbName,"C:\\Private\\\\DBMS");

Public path (e.g.): _LIT(KDbName,"C:\\Data\\\\DBMS.dat"); _LIT(KDbName,"C:\\Data\\\\DBMS");

2.3 在数据库中创建表 要定义表结构,开发者需要了解三个关键的API概念:列(column),列集(column set)和索引键(index key)。

数据库中的表必须名字唯一,表中的列名也必须唯一,表和列名都是大小写敏感的。 列 数据库中的表是由一系列“列”定义而成的,每个列都具有名字,类型等属性,如果是文本或二进制,还具有最大长度的属性。

与列对于的类是TDbCol。 列集 描述表的列的集合使用类CDbColSet。 TDbColSetter()可以用来遍历整个列集。

下面的代码片段示例了如何在永久文件存储中建立数据库表结构。 ... const int KTitleMaxLength = 60;