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

c++

概要

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

【cocos2d-x】sqlite3のドキュメントを訳してみた
sqlite3を使おうと思い、色々な参考になりそうなブログを回遊しました。 そして、メインとなるメソッドが分かったので公式サイトを見て和訳してみました。 現状(2015/02/27)は3.8.8.3が最新でし...

また、以前に開発のプロが教える 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フォローお願いします

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

そんな時は、是非Twitter (@daiki1003)Instagram (@ashdik_flutter)のフォローお願いします♪

Twitterコミュニティ参加お願いします

Twitterコミュニティ「Flutter lovers」を開設しました!
参加お待ちしております😁

☕️ Buy me a coffee

また、記事がとても役に立ったと思う人は
コーヒーを奢っていただけると非常に嬉しいです!
【cocos2d-x】cocos記事一覧
cocos記事一覧 Pimpl 激震が走った、Pimplイディオム enum enum struct(class)とは cast 決定版!*_castまとめ sqlit...

コメント

  1. kidcafe より:

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

    • ashdikDalt より:

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

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

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