使用C++从SQLite随机数据

2024-01-08 14:20:10

我使用的是Xcode编写代码,主要是为了练习跨语言调用

导入libsqlite3.tbd

libsqlite3.tbd

编写数据库操作代码

创建People.hpp&People.cpp;
先导入需要的文件;

#include <iostream>
#include <string>
#include <sqlite3.h>
#include <thread>
#include <chrono>
#include <random>
#include <set>

模拟数据是插入10000条,从中随机取出100条;

const int MAX_PEOPLE = 10000;
const int SELECT_COUNT = 100;

class Person {
public:
    int id;
    std::string name;
    Person(int id, const std::string& name) : id(id), name(name) {}
};
  
std::vector<Person> people;
std::set<int> selected; // 用于跟踪已选择的人员序号
sqlite3* db;
  
void insertPerson(int id, const std::string& name) {
    sqlite3_stmt* stmt;
    std::string sql = "INSERT INTO people (id, name) VALUES (?, ?)";
    sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, NULL);
    sqlite3_bind_int(stmt, 1, id);
    sqlite3_bind_text(stmt, 2, name.c_str(), -1, SQLITE_STATIC);
    sqlite3_step(stmt);
    sqlite3_finalize(stmt);
}
  
void selectPerson() {
    std::mt19937 rng; // Mersenne Twister随机数生成器
    while (selected.size() < SELECT_COUNT) {
        std::uniform_int_distribution<int> dist(1, MAX_PEOPLE); // 生成1到MAX_PEOPLE之间的随机数
        int randomId = dist(rng); // 随机选择一个id
        if (selected.find(randomId) == selected.end()) { // 如果人员未被选择过
            selected.insert(randomId); // 标记为已选择
            std::cout << "Selected person with ID: " << randomId << ", Name: " << people[randomId - 1].name << std::endl;
        }
    }
}

void randomPeople(void) {
    // 初始化SQLite数据库和表
    sqlite3_open("people.db", &db);
    std::string sql = "CREATE TABLE IF NOT EXISTS people (id INTEGER PRIMARY KEY, name TEXT);";
    sqlite3_exec(db, sql.c_str(), NULL, NULL, NULL);
    sqlite3_close(db); // 关闭数据库连接,以便其他线程可以访问它
  
    // 插入人员数据并生成人员列表
    for (int i = 1; i <= MAX_PEOPLE; ++i) {
        std::string name = "Person " + std::to_string(i); // 示例姓名,你可以根据需要更改它
        insertPerson(i, name); // 插入数据到数据库中
        people.emplace_back(i, name); // 将人员数据添加到people列表中,以便后续使用
    }
    sqlite3_close(db); // 再次关闭数据库连接,以便其他线程可以访问它(如果使用多线程插入数据,请确保在插入完成后关闭数据库连接)
  
    // 创建并启动线程来异步选择人员
    for (int i = 0; i < 10; ++i) { // 创建10个线程来异步选择人员(可以根据需要调整线程数量)
        std::thread t(&selectPerson); // 在新的线程中运行selectPerson函数
        t.detach(); // 让线程在后台运行,不需要等待它完成(注意:在多线程环境中使用数据库时,要确保适当的同步和错误处理)
    }
    std::this_thread::sleep_for(std::chrono::seconds(10)); // 等待10秒,以便线程有时间执行(可以根据需要调整等待时间)
}
编写桥接部分

我是使用Swift调用C++函数,这里使用C进行桥接;
先创建C文件PeopleBridging.h&PeopleBridging.c,People.cpp中导入PeopleBridging.h;

#include "PeopleBridging.h"

PeopleBridging.h中对函数进行共享;

#ifndef PeopleBridging_h
#define PeopleBridging_h

#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif

void randomPeople(void);

#ifdef __cplusplus
}
#endif

void c_randomPeople(void);

#endif /* PeopleBridging_h */

PeopleBridging.c中执行;

#include "PeopleBridging.h"

void c_randomPeople(void) {
    randomPeople();
}

现在Swift中可以直接调用了。
运行结果

文章来源:https://blog.csdn.net/weixin_42979360/article/details/135335358
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。