【c++】sqliteを実際に使ってみる。

c++

概要

以前のエントリでsqliteのドキュメントを訳しました。

【cocos2d-x】sqlite3のドキュメントを訳してみた
sqlite3を使い始めたいけど、ドキュメントが英語でお困りではないですか? この記事ではドキュメントを日本語訳していますので、安心してお読みいただけると思います。 是非ご覧ください。

また、以前に開発のプロが教える Cocos2d-x逆引きガイドブックを購入し、sqliteの部分をみました。

最初は本の通りに実装して動きました。

ですが、クエリのバインド部分が個人的には好みではない(曖昧ですが)処理でした。
なので、自分なりに少し変更したコードを書こうと思います。

※ご要望があれば全ソースコードをgithub等に載せようかなと思ってます。
※まだ実運用などは出来ていないのでエラー処理等甘い部分があるかと思います。その旨まで教えていただけたら幸いです。

本におけるバインド処理

まずはに載っているコードをご覧ください。

void SQLiteHelper::exec(const char* format, ...)
{
    // prepare実行(略)
    int i = 1;
    while (*format)
    {
        if (*format == '?')
        {
            sqlite3_bind_text(statement, i, va_arg(args, char*), -1, SQLITE_TRANSIENT);
            ++i;
        }
        ++format;
    }
    // step, reset, finalize実行(略)
}

formatを一文字ずつ進めていき、?であればbindを実行する、といった処理です。

今回書いたバインド処理

void SQLiteHelper::exec(const char* formatter, map<string, string> params)
{
    // prepare実行(略)
    for (int bind_index = 1; bind_index <= sqlite3_bind_parameter_count(statement); bind_index++) // A.
    {
        string name = sqlite3_bind_parameter_name(statement, bind_index); // B.
        name.erase(name.begin()); C.
        sqlite3_bind_text(statement, bind_index, params.at(name).c_str(), -1, SQLITE_TRANSIENT); D.
    }
    // step, reset, finalize実行(略)
}

使い方

string insert = "insert into test (id, name) values (:id, :name)";
map<string, string> params;
params["id"]   = to_string(1);
params["name"]  = to_string("daiki1003");
execute(insert.c_str(), params);

こんな感じ。では、処理について説明したいと思います。

A. sqlite3_bind_parameter_countでバインドすべきパラメタ数が取得できます。

B. マッピングするためのバインド名を取得します。
:id、の様に返って来ます。

C. 先頭の「:」を削除します。(nameには”id”等が入ります。)

D. paramsから値を取得してSQLにバインドします。

いかがでしたでしょうか?
mapの部分は可変長引数部分をそのまま残しておいても構わないとは思いますが、このような形に変更しました。

誰かのお役に立てば。

Twitterフォローお願いします

「次回以降も記事を読んでみたい!」
「この辺分からなかったから質問したい!」

そんな時は、是非@daiki1003のフォローお願いします♪
【cocos2d-x】cocos記事一覧
cocos記事一覧 Pimpl 激震が走った、Pimplイディオム enum enum struct(class)とは cast 決定版!*_castまとめ sqlit...

コメント

  1. kidcafe より:

    こんにちは。
    cocos2dxを勉強している駆け出しのものです。
    私も、「開発のプロが教える Cocos2d-x逆引きガイドブック」を購入し、sqlite3を導入の勉強をしているのですが
    int型を取り出すことができません。
    こちらのソースをいただくことは可能でしょうか?

    • ashdikDalt より:

      kidcafeさん
      コメントありがとうございます!
      もちろん使っていただいて結構です^^

      もし、使い心地について何かあればまたおっしゃっていただければと思いますー!

タイトルとURLをコピーしました