存储
*相关流的集合
*用于实现对象的持久性
*通常,存储是一个文件
- 尽管也提供内存存储
- 存储也可以嵌入其它存储的流中
*出于各种考虑,取代直接使用文件和文件服务器客户端API
- 尽管与文件服务器的其它特征依然相关
*对于应用程序的框架意义重大,因为它提供对嵌入文档的支持
*存储也是DBMS提供的相关数据库的基础
存储流
*在存储中适合使用流这种类型
*流通常是在存储地上下文中创建的
*存储中的流由如下两个具体类中的一个封装
- RStoreWriteStream代表写入流
·支持存储中流的创建和操作
- RStorReadStream代表读取流
·支持存储中已存在的流的打开的操作
流ID
*在存储中,流的唯一的标识
- 由TStreamId类封装
*用于给定的存储上下文中,并用来打开流
- 比如 RStoreReadStream::OpenLC(CFileStore& store, TStreamId streamId);
*TStreamId提供ExternalizeL()和InternalizeL()函数
- 流的ID可以外部化到其它流中,这是流网络的基础
*在存储中保存
- 如果只有一个流,那么流ID保存在存储根中
- 如果存储包含不止一个流,那么流ID保存在流字典中
使用存储流
*RStoreWriteStream
- CreateL()或CreateLC()可以在存储中创建一个新的流
- OpenL()或OpenLC()可以在存储中打开一个已经存在的流用于写操作
·注意,并不是所有的存储类型都支持已有的流的修改操作
- CommitL()执行流的外部化操作
·作为一条简单的准则,CreateL()或CreateLC()通过调用CommitL()得以匹配
*RStoreReadStream
- OpenL()或OpenLC()在存储中打开已有的流用于读操作
使用存储流-示例
*使用RStoreWriteStream的CreateL()或CreateLC()成员函数在存储中创建一个新的流,并且返回该流的ID
RStoreWriteStream outstream;
TStreamId id = outstream.CreateLC(*store);
...
CleanupStack::PopAndDestory();
...
*使用RStoreReadStream的OpenL()或OpenLC()成员函数来打开一个流,并且用于读取操作
RStoreReadStream instream;
TStream id;
...
instream.OpenLC(*store,id);
...
存储类型
*CStreamStore定义了在存储中添加和删除流的接口
- 也提供执行/恢复机制,以及空间压缩和回收
*存储类型基于流存储范例
- 持久存储
- 嵌入存储
- 字典存储
- 内存存储
持久存储
*在创建存储的应用程序的生命周期之外,提供存储的持久性
- 比如,文件存储
*尤其提供
- 根流,通过它可以找到存储中所有的其它的流
- 打开和关闭存储的函数
*CPersistentStore,继承自CStreamStore
文件存储
*文件存储是持久性的存储,它可以用来实现应用程序的数据文件
*CFileStore派生的文件存储有两种类型
- 直接文件存储,由具体类CDirectFileStore进行封装
·直接文件存储适用于将数据内存拷贝作为主要拷贝的应用程序,比如文字处理器,这类应用程序实现了经典的载入/保存范例
- 持久文件存储,有具体类CPermanetFileStore进行封装
·通常,持久文件存储适用于数据库应用程序,这类应用程序将所有的数据保存在文件中,但是偶尔会编辑数据库中的一些条目
使用文件存储
*CreateLC()创建一个存储
*RepalceLC()替换已有存储
*Open()或OpenLC()打开一个已有存储
*File()从存储中获得RFile对象的拷贝
*Detach()将存储和文件分离,实际上是放弃了文件的所有权
*Reattach()重新建立文件和文件存储的关联,实际上是获取该文件的所有权
使用文件存储- 示例
*在如下的代码片段中
- 与文件存储相关联的文件被分离和关闭
- 该文件然后重新打开并和该文件存储重新建立关联
LOCAL_C void doUseL(const TDesC& aName)
{
TParse filestorename;
...
fsSession.Parse(aName,filestorename);
CFileStore* store = CPermanentFileStore::OpenLC(fsSession, filestorename, FullName(), EFileRead|EFileWrite);
RFile thefile = store->File();
store->Detach();
thefile.Close();
...
thefile.Open(fsSession,filestorename.FullName(), EFileRead|EFileWrite);
store->Reattach(thefile);
...
}
嵌入存储
*可以在其它存储中以流的形式保存
*用来代表一个部分对象网络
- 通过从包含的存储中拷贝(或删除)主要的流,可以更加简便地实现部分对象网络操作
*行为和直接文件存储类似
- 一旦写入,存储中的流就不能被修改
*用于嵌入应用程序框架的对象
- 只能嵌入直接代表文档的类型
*CEmbeddedStore,继承自CPersistentstore
字典存储
*按照通常方式包含流,但是不同的是,根流是流字典
- 流通过UID访问,而不是直接通过流ID访问
- 主要被应用程序框架用来处理.ini文件
*接口由CDictionaryStore抽象类提供
- CDictionaryFileStore是具体类的一个示例,它使用文件存储来实现
*并非继承自CStreamStore,但是拥有自己的持久存储CPersistentStore和流字典CStreamDictionary
*特殊的流类型RDictionaryWriteStream和RDictionaryReadStream主要用于字典存储
流字典
*维持一张列表,用来保持UID和流ID之间的对应关系
- UID按照特定的目的来标识流
*每一个TUid和TStreamId对构成了数组的一个条目
*类型CStreamDictionary
- 提供成员函数来管理数组条目,比如,添加新的条目,或者改变与UID相关联的流ID
*系统初始化文件使用了流字典