SDKに同梱されているコードがいまいちわかりにくかったので、オフィシャルサイトにあるdocumentationからサンプルコードを拝借する。
■DBManager.cpp
とりあえず上から読んでいってSQLもしくはそれに準ずるものを探す。
result DBManager::CreateTable()
CREATE TABLE文がそのまま見つかったので読んでみる。
String sql; result r = E_SUCCESS; sql.Append(L"CREATE TABLE IF NOT EXISTS member(seq INTEGER PRIMARY KEY,id varchar(20),name varchar(20),age INTEGER)"); r = Execute(sql); AppLog("create : %s",GetErrorMessage(r)); return r;
SQL文を作ってそのままprivateメソッドに投げてるようだ。
result DBManager::Execute(String sql)
投げられたSQLをそのまま処理しているようだ。
__pDatabase->BeginTransaction(); r = __pDatabase->ExecuteSql(sql, true); __pDatabase->CommitTransaction();
__pDatabaseを操作している。
result DBManager::Open(String dbName)
__pDatabaseをインスタンス化している。use `dbname`;的なところでDBをopenしているところのようだ。
AppLog("Open"); __dbName = dbName; result r = E_SUCCESS; __pDatabase = new Database; __pDatabase->Construct(__dbName,true); return r;
bool DBManager::IsMember(String id)
以下のとおり取り出したデータはAndroidのCursorのようになっているようだ。
bool isMember = false; String sql; sql.Format(100,L"SELECT id FROM member where id = '%ls'",id.GetPointer()); // select a query using the Database::QueryN() wrapper AP DbEnumerator* pEnum = __pDatabase->QueryN(sql); if (pEnum) { while (pEnum->MoveNext() == E_SUCCESS) { isMember = true; } delete pEnum; } return isMember;
result DBManager::GetAllMember(ArrayList& list)
もう少しちゃんと取り出しているところを見る。
AppLog("GetAllMember"); result r = E_SUCCESS; String sql; sql.Format(50,L"select seq, id, name,age from member"); MEMBERINFO* pInfo = null; // select a query using the Database::QueryN() wrapper AP DbEnumerator* pEnum = __pDatabase->QueryN(sql); if (pEnum) { while (pEnum->MoveNext() == E_SUCCESS) { pInfo = new MEMBERINFO(); r = pEnum->GetIntAt(0, pInfo->seq); r = pEnum->GetStringAt(1,pInfo->id); r = pEnum->GetStringAt(2,pInfo->name); r = pEnum->GetIntAt(3,pInfo->age); list.Add(*pInfo); } delete pEnum; } return r;
サンプルコードが簡略化されていて理解しやすい。
■DBManager.h
このクラスはSingletonパターンになっていて以下のメソッドでインスタンスを取得する。
static DBManager* GetDB() { if(__pInstance == null) { __pInstance = new DBManager(); } return __pInstance; }
使い終わった時のメソッドも用意されている。
static void ReleaseDB() { if(__pInstance) { delete __pInstance; __pInstance = null; } }
コンストラクタ
DBManager::DBManager() :__pDatabase(null) { // TODO Auto-generated constructor stub Init(); }
void DBManager::Init()
Open(App::GetInstance()->GetAppRootPath() + L"data/mdb.db"); CreateTable();
次の2つのメソッドを呼び出している。
result DBManager::Open(String dbName)
引き数で与えられたデータベースファイルを開く。
AppLog("Open"); __dbName = dbName; result r = E_SUCCESS; __pDatabase = new Database; __pDatabase->Construct(__dbName,true); return r;
result DBManager::CreateTable()
CREATE TABLE文を実行する。
String sql; result r = E_SUCCESS; sql.Append(L"CREATE TABLE IF NOT EXISTS member(seq INTEGER PRIMARY KEY,id varchar(20),name varchar(20),age INTEGER)"); r = Execute(sql); AppLog("create : %s",GetErrorMessage(r)); return r;
デストラクタ
DBManager::~DBManager() { Close(); // TODO Auto-generated destructor stub }
result DBManager::Close()
AppLog("Close"); result r = E_SUCCESS; if(__pDatabase) { delete __pDatabase; __pDatabase = null; } return r;
■Form1.cpp
DBManagerの使い方は以下のようになっている。
GetDB()->GetAllMember(list);
result Form1::OnTerminating(void) { result r = E_SUCCESS; if(__pInfoPopup) { delete __pInfoPopup; __pInfoPopup = null; } ReleaseDB(); // TODO: Add your termination code here return r; }