プログラミング C++ 関連の技術メモ【SQLite の 活用方法(その7)SELECT 】

SQLite 技術メモ : SELECT実装

Select用関数を追加します。今回はとりあえず全レコード取得するだけ。

Select実行時のポイントは、Selectの結果をどのように取得するかです。手段はひとつではありませんが、とりあえず一番有名なところで、callbackを用いた方法を以下に示します。 

ソースコード [NBSQLiteAccessor.h]

#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;
};

 

 

 

ソースコード [NBSQLiteAccessor.cpp]

#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;
}

 

ソースコード [SQLiteTest3.cpp]

~~省略~~~~~~~

    LAP(3);
    std::vector<std::vector<std::string>> tableData = accessor->Select();
    LAP(4);
    for (auto rowData : tableData)
    {
        printf("DATA = ");
        for (auto data : rowData)
        {
            printf("%s | ", data.c_str(