SQLite3 存vector
时间: 2024-09-21 08:09:51 浏览: 70
sqlite数据库C++
4星 · 用户满意度95%
SQLite3 是一个轻量级的关系型数据库系统,它并不直接支持存储 C++ STL 中的 `std::vector` 或其他容器类型。如果你想在 SQLite 中保存 `vector` 对象,通常需要先将其元素序列化为文本或其他便于存储的形式,然后再插入到表中,或者将整个 vector 插入到一个 BLOB(二进制大型对象)列。
以下是一个简单的示例流程:
1. 将 `vector` 转换为字符串(例如 JSON 形式):
```cpp
std::string json;
json = R"({"data": [your_vector_elements]})"; // 使用序列化库如 nlohmann::json 或 std::to_string
```
2. 创建包含 BLOB 列的表:
```sql
CREATE TABLE IF NOT EXISTS your_table (
id INTEGER PRIMARY KEY,
data BLOB
);
```
3. 将 `vector` 写入数据库:
```cpp
sqlite3 *db;
// 打开数据库连接
sqlite3_exec(db, "INSERT INTO your_table (data) VALUES (?)", [](void *blob, int) {
char *json_str = (char *) blob;
sqlite3_free(blob);
sqlite3_finalize(json_db);
}, &json.c_str(), NULL); // 注意这里要管理好JSON字符串的生命周期
```
4. 从数据库检索时再反序列化:
```cpp
sqlite3_stmt *stmt;
sqlite3_prepare_v2(db, "SELECT data FROM your_table WHERE id = ?", -1, &stmt, NULL);
if (sqlite3_step(stmt) == SQLITE_ROW) {
const char* jsonData = reinterpret_cast<const char*>(sqlite3_column_blob(stmt, 0));
std::string deserializedJson(jsonData, sqlite3_column_bytes(stmt, 0));
// 使用反序列化库解析数据
auto deserializedVector = parseDeserializedJson(deserializedJson);
}
```
需要注意的是,每次操作都涉及到数据库I/O,所以在性能上不如直接存储简单类型。如果你的应用场景允许,考虑将整个 `vector` 直接存储为单个BLOB,而不是逐个元素。
阅读全文