存储元数据入门
元数据存储服务可帮助存储提供程序的同步元数据,该提供程序表示无法通过其他方式存储元数据的副本。元数据存储服务使用占用较小内存和磁盘空间的轻型数据库,可以随提供程序重新分发而且可靠。
元数据存储服务 API 将元数据存储区与用于访问元数据存储区的接口和方法明确区分开,这样即可实现备用存储区,且对提供程序稍作变更即可使用备用存储区。
备注
元数据存储服务接口是单线程的。可在任何线程上执行调用。不过,多线程应用程序在使用这些接口时必须提供适当的线程同步。
创建元数据存储区
元数据存储服务提供了 API 实现,该 API 使用轻型数据库将元数据存储在文件中。
托管代码 元数据存储区通过 SqlMetadataStore 对象表示。此对象扩展了 MetadataStore 抽象类。除了提供用于处理副本元数据和事务的基类方法,SqlMetadataStore 还提供用于创建或打开元数据存储区本身的方法。若要创建新的存储区,请调用 CreateStore。若要打开现有的存储区,请调用 OpenStore。
非托管代码 元数据存储区通过 ISqlSyncMetadataStore 接口对象表示。此对象扩展了 ISyncMetadataStore 接口。除了提供用于处理副本元数据和事务的基接口方法,ISqlSyncMetadataStore 还提供用于创建或打开元数据存储区本身的方法。若要创建 ISqlSyncMetadataStore 对象,请将 CLSID_SyncMetadataStore 和 IID_ISqlSyncMetadataStore 传递给 CoCreateInstance。若要创建新的存储区,请调用 ISqlSyncMetadataStore::CreateStore。若要打开现有的存储区,请调用 ISqlSyncMetadataStore::OpenStore。
安全性注意 |
---|
元数据文件未受到保护,无法避免未经授权的访问。若要保护元数据文件,必须对包含它的文件夹进行适当的安全设置,例如通过使用任意访问控制列表 (DACL) 来提供保护。当元数据文件存储在远程位置时,必须对元数据存储服务与远程文件夹之间的通信信道进行适当的保护。若要允许用户删除元数据文件,创建元数据文件的提供程序应将该文件放置于用户可以访问的位置。在卸载创建元数据文件的提供程序时,该提供程序必须删除元数据文件。 |
安全性注意 |
---|
在 Sync Framework 通过远程机制(例如 UNC 路径)打开元数据文件时,元数据文件不能同时被任意计算机上的任何其他应用程序访问,包括存储了元数据文件的计算机上的应用程序。 |
副本元数据
必须先初始化副本元数据,之后才能使用它。对于每个元数据存储区,副本元数据只能初始化一次。如果需要自定义字段或索引,必须在初始化副本元数据时定义它们。
托管代码 通过调用 InitializeReplicaMetadata 初始化副本元数据。
非托管代码 通过调用 ISyncMetadataStore::InitializeReplicaMetadata 初始化副本元数据。
若要访问现有存储区中的副本元数据,必须获取副本元数据对象。每个副本 ID 的副本元数据对象都是不同的。不过请注意,元数据存储服务通过限制同一时间每个副本 ID 仅存在一个副本元数据对象,可以防止对元数据存储区进行并发更新。如果某一指定的副本 ID 已经存在副本元数据对象的实例,在试图打开该对象的过程中,将返回对现有对象的引用。如果某一指定的副本 ID 已经存在副本元数据对象的实例,在打开该对象的过程之外的过程中,打开企图将失败。
托管代码 通过调用 GetReplicaMetadata 获取副本元数据对象。
非托管代码 通过调用 ISyncMetadataStore::GetReplicaMetadata 获取副本元数据对象。
副本元数据对象提供用于访问副本以及该副本所含项的元数据的方法。有关更多信息,请参见访问副本元数据。
自定义项字段
可为项元数据定义一组自定义字段。每个字段均由一个唯一字符串名称和一个值组成。这些字段可用于存储项的默认元数据集不支持的任何其他元数据。可以通过对 ItemMetadata(对于托管代码)或 IItemMetadata(对于非托管代码)使用各种方法来访问这些字段。这些字段及其格式(包括大小和数据类型)是在初始化副本元数据时定义的。
托管代码 通过将 FieldSchema 对象传递给 InitializeReplicaMetadata 指定自定义字段。
非托管代码 通过将 CUSTOM_FIELD_DEFINITION 对象的数组传递给 ISyncMetadataStore::InitializeReplicaMetadata 指定自定义字段。
索引架构
可以定义一组索引架构,这样就可以将自定义字段集用作索引,从而有效地在元数据存储区中查找项。索引架构可定义为唯一,以确保该索引定义单个项。包含在索引架构中的每个字段也还必须存在于为副本定义的自定义字段架构中。
托管代码 通过将 IndexSchema 对象传递给 InitializeReplicaMetadata 指定索引架构。
非托管代码 通过将 CUSTOM_FIELDS_INDEX 对象的数组传递给 ISyncMetadataStore::InitializeReplicaMetadata 指定索引架构。
事务
事务可以是隐式的或显式的。只有从元数据存储区读取数据时才支持隐式事务。未首先启动显式事务即试图写入元数据存储区将引发 ExplicitTransactionRequiredException(对于托管代码)或返回 SYNC_E_METADATA_ACTIVE_TRANSACTION_REQUIRED(对于非托管代码)。
使用托管代码设置元数据
通过调用 BeginTransaction 启动显式事务。通过调用 CommitTransaction 提交事务期间所做的变更。通过调用 RollbackTransaction 放弃事务期间所做的变更。
设置 ReplicaMetadata 或 ItemMetadata 对象的属性。
使用 SaveReplicaMetadata 或 SaveItemMetadata 保存属性。
使用非托管代码设置元数据
通过调用 ISyncMetadataStore::BeginTransaction 启动显式事务。通过调用 ISyncMetadataStore::CommitTransaction 提交事务期间所做的变更。通过调用 ISyncMetadataStore::RollbackTransaction 放弃事务期间所做的变更。
设置 IReplicaMetadata 或 IItemMetadata 对象的属性。
使用 IReplicaMetadata::SaveReplicaMetadata 或 IReplicaMetadata::SaveItemMetadata 保存属性。
备注
此事务服务仅适用于存储在元数据存储区中的元数据。保存在副本的项存储区中的任何项数据不包括在此事务中。
请参阅
参考
ISqlSyncMetadataStore 接口
CUSTOM_FIELD_DEFINITION 结构
IReplicaMetadata 接口
IItemMetadata 接口
CUSTOM_FIELDS_INDEX 结构
SqlMetadataStore
FieldSchema
ReplicaMetadata
ItemMetadata
IndexSchema