儲存
*相關流的集合
*用於實現對象的持久性
*通常,儲存是一個檔案
- 儘管也提供記憶體儲存
- 儲存也可以嵌入其它儲存的流中
*出於各種考慮,取代直接使用檔案和檔案伺服器用戶端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
*系統初始設定檔案使用了流字典