定义一个容器存放数据库中表信息数据:

static std::map<QString, std::vector<std::vector<std::tuple<QVariant::Type, QString, QString>>>> read(const QString& name);
// 	 表名    //表数据vector    //每一条数据每一列的信息vector    类型    列名    值

 


定义接口函数如下,传入数据库名称即可:

/************************************
 *@func:   SqliteReader::read
 *@brief:  返回值中已拿到表名 列名 单元格数据信息
 *@params: const QString & name 数据库名
 *@return: std::map<QString, std::vector<std::vector<std::tuple<QVariant::Type, QString, QString>>>>
************************************/
std::map<QString, std::vector<std::vector<std::tuple<QVariant::Type, QString, QString>>>> 
SqliteReader::read(const QString& name)
{
	std::map<QString, std::vector<std::vector<std::tuple<QVariant::Type, QString, QString>>>> values{};

	// 打开数据库
	s_db = QSqlDatabase::addDatabase("QSQLITE");
	s_db.setDatabaseName(name);
	if (!s_db.open())
	{
		qDebug() << s_db.lastError().text();
		return values;
	}

	// 读数据
	for (const auto& tableName : s_db.tables())
	{
		QString selectSql = QString("select * from %1;").arg(tableName);
		QSqlQuery query{};
		if (!query.exec(selectSql))
		{
			qDebug() << query.lastError().text();
			continue;
		}

		std::vector<std::vector<std::tuple<QVariant::Type, QString, QString>>> tableDatas;
		while (query.next())
		{
			std::vector<std::tuple<QVariant::Type, QString, QString>> singleResultInfos{}; // 单条数据信息
			for (int i = 0; i < query.record().count(); ++i)
			{
				auto type = query.record().field(i).type();
				auto name = query.record().fieldName(i);
				auto value = query.record().value(i).toString();
				singleResultInfos.emplace_back(std::make_tuple(type, name, value));
			}

			tableDatas.emplace_back(std::move(singleResultInfos));
		}
		values[tableName] = std::move(tableDatas);
	}

	return std::move(values);
}

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐