github地址:https://github.com/JuicyActive01Gilbert/SqliteManager
用到的相关数据库语句
//获取数据库中所有表
SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;
//获取表中的外键
PRAGMA foreign_key_list('表的名字');
//获取表结构(用于提取主键)
PRAGMA table_info('%1');
//还有基础的查询语句、更新语句这里便不在列出
简易流程图
关键代码实现
void SqlSynchronize::synchronize()
{
QStringList tables = m_pDB->getTableList();
QStringList synTables = m_pSynDB->getTableList();
m_isCover = false;
foreach (QString synTable, synTables) {
if(!tables.contains(synTable)){
m_isCover = true;
return;
}
}
m_synedTables.clear();
synchronizeTables(synTables);
}
void SqlSynchronize::synchronizeTables(const QStringList &tables)
{
int i = 0;
int count = tables.count();
foreach (QString synTable, tables) {
synchronizeTable(synTable);
emit progressStatus(i + 1,count);
}
}
void SqlSynchronize::synchronizeTable(const QString &table)
{
if(m_synedTables.contains(table)){
return;
}
QStringList parentTables = m_pSynDB->getParentTables(table);
if(parentTables.count() != 0){
foreach (QString parentTable, parentTables) {
if(m_synedTables.contains(parentTable)){
continue;
}else{
synchronizeTable(parentTable);
}
}
}
QVariantList synDatas = m_pSynDB->selectDatas(table);
QVariantList datas = m_pDB->selectDatas(table);
foreach (QVariant data, datas) {
foreach (QVariant synData, synDatas) {
if(data == synData){
synDatas.removeOne(synData);
}
}
}
QStringList pks = m_pDB->getTablePrimarykeys(table);
foreach (QVariant synData, synDatas) {
QVariantMap map = synData.toMap();
QVariantMap condition;
foreach (QString key, pks) {
condition.insert(key,map.value(key));
}
int count = m_pDB->selectDatas(table,condition).count();
//update
if(count != 0){
m_pDB->updateData(table,map,condition);
}else{//insert
m_pDB->insertData(table,map);
}
}
m_synedTables.append(table);
}
其中m_pDB和m_pSynDB是由已经封装好的数据库操作类实例化而成,主要包含数据库的基本操作。