qt - 如何在两个sqlite-内存数据库之间复制?

标签 qt sqlite in-memory-database

如何在Qt中的两个sqlite-内存数据库之间进行复制。就像这样:

QSqlDatabase db1 = QSqlDatabase::addDatabase ("QSQLITE", "db1");
QSqlDatabase db2 = QSqlDatabase::addDatabase ("QSQLITE", "db2");
db1.setDatabaseName (":memory:");
db2.setDatabaseName (":memory:");
db1.open();
db2.open();
//add Data to db1
//do sth to copy db1's data to db2 [How]

最佳答案

前段时间我遇到了类似的问题(但是将 MySQL 数据库复制到 SQLite)。 我使用了以下代码(未经测试,full code, ll. 40-167)

QString table("mytable");
QSqlDatabase srcDB=QSqlDatabase::addDatabase("QSQLITE", "db1");
QSqlDatabase destDB=QSqlDatabase::addDatabase("QSQLITE", "db2");

QSqlQuery srcQuery(srcDB);
QSqlQuery destQuery(destDB);

// get table schema
if (!srcQuery.exec(QString("SHOW CREATE TABLE %1").arg(table)))
    return false;

QString tableCreateStr;

while(srcQuery.next())
  tableCreateStr=srcQuery.value(1).toString();

// drop destTable if exists
if (!destQuery.exec(QString("DROP TABLE IF EXISTS %1").arg(table)))
     return false;

// create new one
if (!destQuery.exec(tableCreateStr))
    return false;

// copy all entries
if (!srcQuery.exec(QString("SELECT * FROM %1").arg(table)))
    return false;

while (srcQuery.next()) {
    QSqlRecord record=srcQuery.record();
    QStringList names;
    QStringList placeholders;
    QList<QVariant > values;

    for (int i = 0; i < record.count(); ++i) {
        names << record.fieldName(i);
        placeholders << ":" + record.fieldName(i);

        QVariant value=srcQuery.value(i);

        if (value.type() == QVariant::String)
            values << "\"" + value.toString() + "\"";
        else
            values << value;
    }

    // build new query
    QString queryStr;
    queryStr.append("INSERT INTO " + table);
    queryStr.append(" (" + names.join(", ") + ") ");
    queryStr.append(" VALUES (" + placeholders.join(", ") + ");");

    destQuery.prepare(queryStr);

    foreach(QVariant value, values)
        destQuery.addBindValue(value);

    if (!destQuery.exec())
        return false;
}

关于qt - 如何在两个sqlite-内存数据库之间复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9348659/

相关文章:

c++ - Qt C++ : Line edit accept only alphanumeric characters, 破折号和下划线

H2 数据库 - MySQL 脚本的未知数据类型

dictionary - 在 Hazelcast 中创建另一个 map 函数?

grails - 如何将 2 个不同的项目连接到同一个开发环境数据库?

qt - 在 BB10 应用程序上,如何在到达列表末尾之前向 ListView 添加更多项目?

c++ - 使用 vlc-qt 拉伸(stretch)视频播放器?

python - 如何减去QPainterPaths、QPolygon?

android - 当不存在数据库或表时,是否可以在 Android 中模拟 sqlite3 Cursor?

编译时出现 android.database.sqlite.SQLiteException : near "20": syntax error (code 1): ,:从数据 = 19/04/2015 20:59 处的意外删除

android - Android中的 "-journal"SQLite数据库是什么?