一、应用场景
随着需求的变化,数据库表结构可能发生改变,这个时候就需要对数据库文件进行升级。抽象接口如下:
//注:class IDataBase;
//typdef shared_prt<IDataBase> SPIDataBase;
class IDBVersion;
class IDBVersionFactory;
typedef shared_ptr<IDBVersion> SPIDBVersion;
typedef shared_ptr<IDBVersionFactory> SPIDBVersion;
class IDBVersion
{
public:
virtual ~IDBVersion() {}
//创建该版本的数据库
virtual bool OnCreate(SPIDataBase spDb) = 0;
//升级到当前版本,初始化版本数据库不需要升级
virtual bool Upgrade(SPIDataBase spDb) = 0;
}
//提供抽象工厂模式,扩展数据库版本升级
//升级数据库时,提供对应版本升级实现方法以及对应创建Factory对象
//此时,不需要更改客户代码,就能完成数据库版本升级
class IDBVersionFactory
{
public:
virtual ~IDBVersionFactory(){}
virtual SPIDBVersion ProduceVersion() = 0;
}
升级数据库版本,需要提供对应版本对此接口的实现
//提供函数接口获取对应版本IDBVersion
class CDBVersion1; //......实现略
class CDBVersionFactory1;//......实现略
class CDBVersion2;//......实现略
class CDBVersionFactory2;//......实现略
SPIDBVersion GetSuitableVersion(const int iVersion)
{
SPIDBVersionFactory spFactory;
SPIDBVersion spVersion;
switch(iVersion)
{
case 1:
{
spFactory = SPIDBVersionFactory(new CDBVersionFactory1);
if(spFactory)
{
spVerion = spFactory->ProduceVersion();
}
}
break;
case 2:
{
spFactory = SPIDBVersionFactory(new CDBVersionFactory2);
if(spFactory)
{
spVerion = spFactory->ProduceVersion();
}
}
break;
default:
{
spFactory = SPIDBVersionFactory(new CDBVersionFactory1);
if(spFactory)
{
spVerion = spFactory->ProduceVersion();
}
}
break;
}
}
数据版本升级主逻辑:
bool OpenDB(void *param)
{
SPIDataBase spDb;
int iVersion, iOldVersion, iNewVersion;
//param参数用于实例化 数据库对象
//......省略步骤
//......省略数据库当前版本,和历史版本获取
assert(spDb);
//iOldVersion,读取数据获取,如果不存在数据库则iOldVersion将赋值为初始化版本1
SPIDBVersion spVersion = GetSuitableVersion(iOldVersion);
assert(spVersion);
spVersion->OnCreate(spDb);//创建表操作,不存在则创建
for(iVersion = iOldVersion + 1; iVersion <= iNewVersion; ++iVersion)
{
spVersion = GetSuitableVersioin(iVersion);
assert(spVersion);
spVersion->Upgrade(spDb);
}
return true;
}
最后:今后完成数据库版本升级时,需要新版本的实现以及工厂类:提供前一个版本升级到后一个版本的升级方法。修改SPIDBVersion GetSuitableVersion(const int iVersion)接口,即完成版本升级