C++Qt中如何将vector<vector<Point>> contours的数据仪二进制的形式写入sqlite3数据库,并从数据库中读出来
时间: 2024-10-18 09:09:52 浏览: 37
在C++中,特别是使用Qt库结合SQLite作为数据库,你可以使用`QSqlDatabase`、`QSqlQuery`以及一些容器处理技术来操作这种二维向量的数据结构。首先,你需要包括相关的头文件并创建一个SQLite连接:
```cpp
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QByteArray>
#include <QDataStream>
// 假设Point是一个自定义类,包含x和y坐标
struct Point {
int x;
int y;
};
```
接下来,我们将数据写入数据库:
```cpp
// 定义一个函数用于序列化向量
void serializeContourToBlob(vector<vector<Point>>& contour, QByteArray& blob) {
QDataStream out(&blob, QIODevice::WriteOnly);
for (const auto &row : contour) {
for (const auto &point : row) {
out << point.x << point.y;
}
}
}
// 写入数据库
void saveContoursToSqlite(QSqlDatabase& db, const QString& tableName, vector<vector<Point>>& contours) {
QSqlQuery query(db);
query.prepare("INSERT INTO " + tableName + " (contour_data) VALUES (?)");
QByteArray blob;
serializeContourToBlob(contours, blob);
query.addBindValue(blob);
if (!query.exec()) {
// 处理错误
}
}
```
然后,从数据库读取数据:
```cpp
// 反序列化从数据库获取的数据
vector<vector<Point>> loadContoursFromSqlite(QSqlDatabase& db, const QString& tableName) {
QSqlQuery query(db, "SELECT contour_data FROM " + tableName);
if (!query.exec()) {
// 处理错误
}
while (query.next()) {
QByteArray blob = query.value(0).toByteArray();
QDataStream in(blob, QIODevice::ReadOnly);
QVector<QVector<Point>> contours;
while (!in.atEnd()) {
QVector<Point> contour;
in >> contour; // 解析点
contours.append(contour);
}
return contours;
}
return {}; // 数据不存在或查询结果为空
}
```
阅读全文