Qt——Sqlite同构数据库同步

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是由已经封装好的数据库操作类实例化而成,主要包含数据库的基本操作。

发布了28 篇原创文章 · 获赞 4 · 访问量 7379

猜你喜欢

转载自blog.csdn.net/JuicyActiveGilbert/article/details/105119597