🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

COCOS2D-X

COCOS2D-Xは、 2Dゲームを手軽に開発できるフレームワークのことです。 iPhone(iOS)向け、Android等に対応しており、 実質ワンソースで開発が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

8601閲覧

C++ SQLiteで取得したデータを配列に詰める方法(C++, cocos2d-x, SQLite, Visualstudio2015)

tsysrtk

総合スコア15

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

COCOS2D-X

COCOS2D-Xは、 2Dゲームを手軽に開発できるフレームワークのことです。 iPhone(iOS)向け、Android等に対応しており、 実質ワンソースで開発が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/07/04 05:13

編集2017/07/04 05:17

最近プログラムを始めた初心者という前提でお願いいたします。
個人的にcocos2d-xを使ってC++でゲームを作っています。
データ管理のためにSQLiteを使っています。

// characte_infoテーブルから、ユーザーのキャラクターレコードを抽出
std::string sql = "SELECT chara_id, name, sex, job, level, job_level FROM character_info WHERE chara_id in('1','2','3')"
sqlite3_stmt *pStmt = nullptr;
int result = sqlite3_prepare_v2(pDB, sql.c_str(), 128, &pStmt, nullptr);
if (result != SQLITE_OK) {
// sql失敗時
sqlite3_reset(pStmt);
sqlite3_finalize(pStmt);
sqlite3_close(pDB);
return false;
}
int colCount = sqlite3_column_count(pStmt);
while (sqlite3_step(pStmt) == SQLITE_ROW) {
for (int col = 0; col < colCount; col++) {
std::string name = sqlite3_column_name(pStmt, col);
std::string value = cocos2d::StringUtils::format("%s", sqlite3_column_text(pStmt, col));
}
}

現在このようになっていますが、それぞれのカラムをキーとした連想配列は、

std::mapstd::string,std::string memberInfo[カラム] = 値;

でできるのですが、
特定のカラムをキーにした

srd::map<std::string, std::map<std::string, std::string>> memberInfo[キャラID][カラム] = 値

こういった配列の実現の仕方が分かりません。

そもそもSELECTで抽出したデータを
配列で受け取れないのでしょうか?

どなたかご教授のほどよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

いったん全ての値を取得したあと

c

1std::string char_id = sqlite3_column_name(pStmt, 0); 2std::string sex = sqlite3_column_name(pStmt, 1); 3std::string job = sqlite3_column_name(pStmt, 2); 4std::string level = sqlite3_column_name(pStmt, 3); 5std::string job_level = sqlite3_column_name(pStmt, 4); 6 7std::map<std::string, std::map<std::string, std::string>> memberInfo; 8 9memberInfo[char_id]["sex"] = sex; 10memberInfo[char_id]["job"] = job; 11memberInfo[char_id]["level"] = level; 12memberInfo[char_id]["job_level"] = job_level;

とすれば良いかと思います。ただし上記の sqlite3_column_name で NULL が返ってきた場合を考慮していませんので、そこはご自分で検討願います。

投稿2017/07/04 05:29

mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tsysrtk

2017/07/04 06:07

参考になりましたが、 実現できませんでした。
guest

0

自己解決

int colCount = sqlite3_column_count(pStmt); while (sqlite3_step(pStmt) == SQLITE_ROW) { std::string chara_id = cocos2d::StringUtils::format("%s", sqlite3_column_text(pStmt, 0)); for (int col = 0; col < colCount; col++) { std::string name = sqlite3_column_name(pStmt, col); std::string value = cocos2d::StringUtils::format("%s", sqlite3_column_text(pStmt, col)); GameManager::getInstance().characterInfo[chara_id][name] = value; } }

これで解決できました。

投稿2017/07/04 06:07

編集2017/07/04 06:26
tsysrtk

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mattn

2017/07/04 06:18

char_id を毎回取得していて無駄になっていますね。
tsysrtk

2017/07/04 06:26

こういうことでしょうか?
mattn

2017/07/04 06:35

はい。良いと思います。ちなみに cocos2d::StringUtils::format を使っておられるのは NULL の可能性があるからでしょうか?
tsysrtk

2017/07/04 06:55 編集

そうですね。 一応characterテーブルは全カラムNOTNULLなのですが。 Chara_idをmemberテーブルから取得した後に、 characterテーブルにchara_idでWHEREを掛けていて memberテーブルのchara_idがNULLの場合があるので、 WHEREにNULLがあった場合とかですかね。 まだその辺の挙動を調べていないので、調整中です。
mingos

2017/07/04 12:02

sqlite3_column_text()は、const unsigned char*を返すので、 単純にstd::stringに代入できず、constを外す必要があり、 std::string value = (reinterpret_cast<char const *>(sqlite3_column_text(pStmt, col))); とやっても良いですが、これはあまり書きたくないコードなので、個人的にはこっちのがほうが良いと考えてます。 std::string value = cocos2d::StringUtils::format("%s", sqlite3_column_text(pStmt, col));
tsysrtk

2017/07/06 02:18

なるほど・・・勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問