databasemanager.cpp 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include "databasemanager.h"
  2. #include <QDebug>
  3. #include <QDir>
  4. #include <QMessageBox>
  5. #include <QSqlError>
  6. #include <QSqlQuery>
  7. #include <QStandardPaths>
  8. #include "global.h"
  9. #include "logger.h"
  10. DatabaseManager& DatabaseManager::getInstance() {
  11. static DatabaseManager instance;
  12. return instance;
  13. }
  14. // 创建一个新的数据库连接
  15. DatabaseManager::DatabaseManager() : db(QSqlDatabase::addDatabase("QSQLITE")) {
  16. // 设置SQLite数据库文件路径
  17. QString appDataPath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
  18. QDir appDataDir(appDataPath);
  19. if (!appDataDir.exists()) {
  20. appDataDir.mkpath(".");
  21. }
  22. QString dbPath = appDataPath + "/smartmine.db";
  23. db.setDatabaseName(dbPath);
  24. if (!db.open()) {
  25. Logger::getInstance().error(
  26. QString("SQLite Connected error. path: %1, error: %2").arg(dbPath, db.lastError().text()));
  27. QMessageBox::critical(nullptr, "错误",
  28. QString("无法连接数据库, 请联系开发人员。\n 错误: %1").arg(db.lastError().text()));
  29. throw std::runtime_error("Database connection failed: " + db.lastError().text().toStdString());
  30. }
  31. Logger::getInstance().info(QString("SQLite Connected. path: %1").arg(dbPath));
  32. // 初始化数据库表结构
  33. initializeTables();
  34. }
  35. DatabaseManager::~DatabaseManager() {
  36. if (db.isOpen()) {
  37. db.close();
  38. }
  39. }
  40. QSqlDatabase& DatabaseManager::getDatabase() { return db; }
  41. void DatabaseManager::initializeTables() {
  42. QSqlQuery query(db);
  43. // 创建 h_project 表 (SQLite语法,基于提供的MySQL结构)
  44. QString createHProjectTable = R"(
  45. CREATE TABLE IF NOT EXISTS h_project (
  46. id INTEGER PRIMARY KEY AUTOINCREMENT,
  47. uuid TEXT,
  48. name TEXT,
  49. company_code TEXT,
  50. htid TEXT,
  51. xmbh TEXT,
  52. operator_name TEXT,
  53. operator_identity TEXT,
  54. blaster_name TEXT,
  55. blaster_identity TEXT,
  56. lora_address TEXT,
  57. blast_count TEXT,
  58. address_uuid TEXT,
  59. pc_sn TEXT,
  60. det_sum TEXT,
  61. file_name TEXT,
  62. file_url TEXT,
  63. blast_status TEXT,
  64. created_at TEXT,
  65. updated_at TEXT,
  66. deleted_at TEXT,
  67. create_by INTEGER,
  68. update_by INTEGER,
  69. address_path TEXT,
  70. deletion_date TEXT
  71. )
  72. )";
  73. if (!query.exec(createHProjectTable)) {
  74. Logger::getInstance().error(QString("Failed to create h_project table: %1").arg(query.lastError().text()));
  75. throw std::runtime_error("Failed to create h_project table");
  76. }
  77. // 创建索引(可选,提高查询性能)
  78. query.exec("CREATE INDEX IF NOT EXISTS idx_h_project_uuid ON h_project(uuid)");
  79. query.exec("CREATE INDEX IF NOT EXISTS idx_h_project_blast_status ON h_project(blast_status)");
  80. query.exec("CREATE INDEX IF NOT EXISTS idx_h_project_deletion_date ON h_project(deletion_date)");
  81. Logger::getInstance().info("Database tables initialized successfully");
  82. }