S60平台:使用DBMS APIs —DBMS的管理结构和元素(1)

来源:百度文库 编辑:神马文学网 时间:2024/04/28 08:54:28
1、绪论
这篇文档的目的是演示在Symbian 系统上如何使用关系型数据库的APIs。总之,这部分功能被看作数据库管理系统的APIs。
Symbian系统的DBMS提供了创建与维持数据库的功能,通过本地调用和SQL调用,其可以对数据库进行安全可靠的数据访问。这种调用支持事务/回滚机制用以保证所有数据被写入或
数据为空的情形获得支持。
文档提供的代码片段出自 S60 Platform: DBMS Example [1],用以演示创建和操作一个简单图书数据库的关键技术。贯穿整个文档的代码片段都源自样例的重要部分或自样例引申
而来。虽然文档主要描述了S60平台对DBMS APIs的支持,但这种支持在其他大多数Symbian系统设备上也适用。
2、DBMS的管理结构和元素
Symbian操作系统的DBMS为关系型数据库提供了一个功能性接口。任何Symbian系统的DBMS都采用层次性的结构—最底层是保存数据库的文件仓库。
DBMS中,表是行的容器,由列来定义。列通过数据类型与数据长度来定义,列的组合就是行集。DBMS支持丰富的数据类型。
对开发人员来说,他们过去常常在类似ISAM的无DBMS的数据库环境中工作,在该类环境中,行可被视为记录,行可被视为域。然而,必须要指出的是,在有DBMS的数据环境中,行
和列还拥有其他属性,其并非简单地与记录和域相联系。
Symbian操作系统的DBMS是一个功能强大,或为轻量集的数据库关系系统实现。它支持普通的添加/查找/检索/更新/删除功能,同时它还支持基本的结构化查询语言
(Structured Query Language:SQL),数据定义语言(Data Definition Language:DDL)和数据建模语言(Data Modeling Language:DML)语句处理。
对于其他高级关系型数据库管理(Relational Database Management System)功能, 例如SQL集合与触发器事件,Symbian 系统的DBMS并不支持。
2.1 永久文件存储系统和流
Symbian 系统的DBMS依赖于文件服务器提供的资源,Symbian系统所有的永久文件存储和流能提供系统所需要的底层存储功能。
在Symbian 系统中,文件存储和流的联系很紧密。需要指出的是,除了与DBMS相关联的情形,文档并不依赖于文件存储和流。关于文件服务器上,文件存储与流APIs的详细信息可
以在Symbian主站上的S60 SDK文档中找到。
概括地说,文件存储是在“磁盘”上的一个文件,文件存储有一个目录列表可视的名字。然而,从过去文件存储的使用执行情况来看,在那种模式下,不论是文件存储的内容还是
使用它的目的可能都无法立刻显现出来。
流是使存储系统数据进入与流出过程内部化或具体化的对象。因此,一个存储系统可以被简单地看做是多个流的集合。
一个永久文件存储系统模式使用可独立变更的流存储类型(而不是像其他存储模式那样使用所有流统一变更的方式)并且,对象网络包含结构化的应用程序数据,以便存储系统修
改时数据段的装载和写入。数据变更时使用的媒介是RAM。
永久文件系统通过使用CPermanentFileStore 来获得,它是一个源自CFileStore的具体类。这些类在文件存储API中定义,可为DBMS提供组建模块。
大多数操作的文件存储执行过程都由抽象储存架构来定义。更为重要的是,在一个永久文件存储系统中,流可以是:
·写入前进行创建
·覆盖
·替换
·删除
2.2 创建数据库
有两种APIs可以用来创建数据库:
RDbStoreDatabase提供了一个接口用来创建和打开一个专门的数据库,这种数据库的访问方式是非共享的。数据库直接对文件进行操作。因此这种方式也被称为客户端访问。
RDbNameDatabase提供了一个接口用来创建,格式化和打开一个用名字定义的数据库。这类方式允许双客户端(独占式)和共享式客户端/服务器访问。
不考虑API的选择问题,数据库在文件中创建。在创建阶段,两种APIs都使用RFs文件服务会话以独占模式打开数据库。
如果数据库需要被共享,则其必须使用RDbNameDatabase创建和关闭,最终使通过使用服务器会话RDbs的RDbNamedDatabase来打开数据库。
RDbNameDatabase提供了操作数据库的首选方法。如果数据库必须是文件的一部分(例如,一个统一配置文件同时也有其他流),可以使用RDbStoreDatabase,这时,数据库的流ID
不能与根文件重名。当文件存储系统的根节点流ID 指向数据库时,使用RDbStoreDatabase创建的数据库可以用RDbNamedDatabase来打开,反之亦然。但是,在这种情况下,客户端
/服务器机制无法使用。
下面说明了APIs可以:
·创建数据库结构(创建表)
·创建索引(es)
当这些步骤完成时,数据库便可以预备接受数据。Symbian 系统DBMS确保了在一次操作中可以:
·当入口创建时,将其添加到数据库中
·在数据库中保存一份索引的内部拷贝
·当一个入口被选择用于显示或编辑时,其数据从数据库中获得并且所有的入口数据都保存在一个内部临时表格中
·当入口被编辑和保存时,入口在数据库中被替换。
·当应用程序已建立时,由于数据都已保存,除了当前接口被编辑时有可能进行数据操作,其它时候则无需进行操作。
一个数据库应用程序很少替换整个存储系统。数据库文件本身是永久存在的,当入口被保存时,其并不会被覆盖。正由于这样,当采用这种类型的存储系统时应当留意。数据库中
的所有链接必须保持无损状态;为了避免空间浪费,数据库中的所有子网流都应可达。
覆盖已有的流不会改变流的长度。然而,试图越过流文件尾进行写操作会失败并导致流的脱离。对一个流进行置换可导致流的大小发生变化。由于流可变可复写,在永久文件系统
中,流的写顺序并不重要。为了避免流的问题,应当使用RDbNamedDatabase。
创建一个使用RDbStoreDatabase 的数据库
下列代码段展示了如何使用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();
);
CreateDb创建了一个新的数据库文件。其使用完全文件名(包括路径)的TFileName。例子中,代码段使用同样的名字来覆盖先前的文件。(Replace())。最后,其创建了根的
流对象并向系统提交数据库结构。
创建一个使用RDbNamedDatabase的数据库
由于无需使用流,使用RDbNamedDatabse创建一个数据库将会是件轻松的工作。
...
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系统的DBMS中,DBMS 的名字长度限制为64个字符。数据库名字需要与文件名字相一致。由程序员来决定是否采用文件扩展名。
下列命名是有效的:
_LIT(KDbName,"C:\\system\\apps\\DBMS\\DBMS.dat");
_LIT(KDbName,"C:\\system\\apps\\DBMS\\DBMS");
在S60第三版中的有效路径和名称如下:
应用程序私有路径:
_LIT(KDbName,"C:\\Private\\\\DBMS.dat");
_LIT(KDbName,"C:\\Private\\\\DBMS");
公共路径(e.g):
_LIT(KDbName,"C:\\Data\\<路径元素>\\DBMS.dat");
_LIT(KDbName,"C:\\Data\\<路径元素>\\DBMS");
S60平台:使用DBMS APIs —DBMS的管理结构和元素(1) S60平台:使用DBMS APIs —DBMS的管理结构和元素(1) S60平台:使用DBMS APIs —DBMS的管理结构和元素(2) S60平台:使用DBMS APIs —DBMS的管理结构和元素(3) S60平台:使用DBMS APIs —DBMS的管理结构和元素(2) S60平台:使用DBMS APIs —DBMS的管理结构和元素(3) S60平台:使用DBMS APIs —总论 DBMS - April 1997 - Server Side DBMS - April 1997 - Server Side 身份和访问管理:平台和基础结构 第 2 章:选择平台的各种方法 平台和基础结构 第 1 章:《平台和基础结构》的简介 PuTTY手机端-S60平台实现SSH接入管理的手机客户端 身份和访问管理:平台和基础结构 第 4 章:设计基础结构 身份和访问管理:平台和基础结构 第 5 章:实施基础结构 身份和访问管理:平台和基础结构 第 6 章:运行基础结构 身份和访问管理:平台和基础结构 第 3 章:问题和要求 使用Carbide.vs与VS.NET2003构建Symbian开发平台-S60 平台(一) 使用Carbide.vs与VS.NET2003构建Symbian开发平台-S60 平台(二) 使用Carbide.vs与VS.NET2003构建Symbian开发平台-S60 平台(三) 使用Carbide.vs与VS.NET2003构建Symbian开发平台-S60 平台(四) 使用Carbide.vs与VS.NET2003构建Symbian开发平台-S60 平台(五) 使用Carbide.vs与VS.NET2003构建Symbian开发平台-S60 平台(六) 使用Carbide.vs与VS.NET2003构建Symbian开发平台-S60 平台(三) 使用Carbide.vs与VS.NET2003构建Symbian开发平台-S60 平台(四)