@blog.justoneplanet.info

日々勉強

TizenアプリでSQLiteを使う

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

コメントはまだありません»

No comments yet.

RSS feed for comments on this post.TrackBack URL

Leave a comment