Select用関数を追加します。今回はとりあえず全レコード取得するだけ。
Select実行時のポイントは、Selectの結果をどのように取得するかです。手段はひとつではありませんが、とりあえず一番有名なところで、callbackを用いた方法を以下に示します。
#pragma once
#include <iostream>
#include <string>
#include <vector>
#include <sqlite3.h>
class NBSQLiteAccessor {
public:
NBSQLiteAccessor();
NBSQLiteAccessor(const NBSQLiteAccessor& sqlite) = delete;
virtual ~NBSQLiteAccessor();
virtual bool CreateTable(std::vector<std::string>& titleData) const;
virtual bool InsertValues(std::vector<std::vector<std::string>>& tableData, const bool TransactionOpt = false) const;
virtual std::vector<std::vector<std::string>> Select() const;
private:
sqlite3 *m_db;
};
#include "NBSQLiteAccessor.h"
#define MY_TABLE_NAME "test_table"
#define MY_DB_NAME "./test.db"
const std::string SQL_CREATE_TABLE = "CREATE TABLE ";
const std::string SQL_INSERT = "INSERT INTO ";
const std::string SQL_TABLE_NAME = MY_TABLE_NAME;
static int callback(void *tableData, int argc, char **argv, char **columnName)
{
//std::vector<std::vector<std::string>>& tableData = (std::vector<std::vector<std::string>>&)tableData;
std::vector<std::string> row;
for (int i = 0; i < argc; i++)
{
std::string tmpData = argv[i] ? argv[i] : "*****";
row.push_back(tmpData);
//printf("%s = %s\n", columnName[i], argv[i] ? argv[i] : "null");
}
*1;
}
printf("\n");
}
END_TIMER();
~~~~~~~
パフォーマンスとしても、そこまで悪くはないみたいですね。次回は、Selectに条件を付けて取得するようにしましょう。
*1:std::vector<std::vector<std::string>>*)tableData)->push_back(row);
return SQLITE_OK;
}
~~省略~~~~
std::vector<std::vector<std::string>> NBSQLiteAccessor::Select() const
{
std::vector<std::vector<std::string>> tableData;
char *errorMessage = nullptr;
auto select = "SELECT * FROM " + SQL_TABLE_NAME;
auto ret = sqlite3_exec(m_db, select.c_str(), callback, &tableData, &errorMessage);
if (ret != SQLITE_OK)
{
std::cout << "Failed to insert data : " << errorMessage << std::endl;
}
return tableData;
}