libro
www.tuyano.com
PhoneGapによるAndroid/iPhoneアプリ開発入門

Databaseオブジェクトによるデータベース・アクセス (4/7)

作成:2012-04-23 09:13
更新:2012-04-23 09:13

■データベースアクセスの基本コード

では、「データベースをオープン」「トランザクション開始」「SQL文を実行」という基本部分を実行するスクリプトを考えてみましょう。下のリスト欄に、ごく基本部分のコードを掲載しておきます。

ここでは、4つの関数を定義してあります。まずはそれぞれの役割を簡単に整理しておきましょう。

onDeviceReady――これがデータベースアクセスの開始部分になります。データベースをオープンし、トランザクションを開始します。
populateDB――トランザクションで呼び出されるコールバック関数です。ここで、サンプルとしていくつかのSQLを実行しています。
errorCB――エラー時に呼び出される関数です。
successCB――トランザクション処理終了後に呼び出される関数です。

では、それぞれの働きを見ていくことにしましょう。まず、スクリプトの一番最初にイベントリスナーの登録処理を用意していますね。
document.addEventListener("deviceready", onDeviceReady, false);
以前にも何度か登場しましたが、「deviceready」というのは、デバイスの準備が完了したことを示すイベントです。データベースもデバイスのボリュームやOSにあるフレームワークなどを利用しますので、ページを開いてすぐには使えません。デバイス利用のための準備が完了したところでようやく疲れう状態となります。そこでdevicereadyイベントを使って処理を呼び出すようにしてあります。
var db = window.openDatabase("Database", "1.0", "mydata", 200000);
db.transaction(populateDB, errorCB, successCB);
devicereadyイベントで呼び出されるonDeviceReady関数内では、この2文が実行されています。既に使い方は説明していますのでやっていることはわかりますね。まず、window.openDatabaseでは、"Database"データベースを200000バイトのサイズ指定をしてオープンしています。バージョンは"1.0"としていますが、これは別にどのようなものでも構いません。同じデータを使うときは同じバージョンを指定すれば問題はありません。

そして、作成したDatabaseオブジェクトのtransactionを呼び出し、populateDBをコールバックで実行するようにしています。この部分は、それほど難しいものはないでしょう。

■テーブルの作成と削除

では、populateDBで実行しているのはどういう処理でしょうか。ここではいくつかのSQL文をexecuteSqlで実行しています。ここで行なっているのは「テーブルの削除」と「テーブルの作成」です。では、実行しているSQL文(クエリーといいます)を整理しましょう。

・テーブルの削除
DROP TABLE テーブル名
DROP TABLE IF EXISTS テーブル名
通常は、「DROP TABLE」でテーブル名を指定すれば、そのテーブルを削除します。が、ここでは「DROP TABLE IF EXISTS」というようになっていますね? <<bB[IF EXISTSは、「テーブルがあったら、DROP TABLEを実行する」という意味です。こうすることで、テーブルがまだない場合に削除しようとしてエラーになるのを防ぐことができます。

・テーブルの作成
CREATE TABLE テーブル名 ( フィールド1, フィールド2, ……)
CREATE TABLE IF NOT EXISTS テーブル名 ( フィールド1, フィールド2, ……)
テーブルの作成も同様です。ただ作るだけなら「CREATE TABLE ~」でOKなのですが、既にテーブルがある場合には実行しないように、「CREATE TABLE IF NOT EXISTS ~」としてあります。「IF NOT EXISTS」は、「テーブルがなかったら○○を実行する」という意味です。

これでテーブルは作れるのですが、問題はテーブル名の後にあるカッコ部分でしょう。ここに、テーブルに用意するフィールドの内容を既述します。これは通常、「名前 型」というように、フィールドの名前と、 そのフィールドに保管する値の種類を指定するのですが、それだけではないのが困りものです。ここでは、それぞれのフィールドに以下のようなものが指定されています。

idフィールド
INTEGER――整数の値です。
NOT NULL――値が空っぽなのはダメ!
PRIMARY KEY――基本となるキーの指定。要するに、これの値でレコードを管理するということ。
AUTOINCREMENT――値を指定しなくても、自動的に1ずつ増やしながら値が設定されます。

titleフィールド
TEXT――テキストの値です。

memoフィールド
TEXT――テキストの値です。

最初のidフィールドの指定がかなりわかりにくいのですが、まぁこれは「IDのフィールドは常にこう指定するのが基本」と考えておけばいいでしょう。これで、とりえあず「実行するとDatabaseデータベースにmymemoというテーブルを毎回用意する」というところができました。最初にDROP TABLEをしてからCREATE TABLEをしていますから、これだと毎回テーブルを新しく作り直すことになります(サンプルなのでそうしてあります)。作成したテーブルをずっと使い続けるなら、DROP TABLEは削除してよいでしょう。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※文末の~~記号は、次の行と続けて記述することを意味します。

// 初期化処理onDeviceReadyを呼び出すためのもの
document.addEventListener("deviceready", onDeviceReady, false);

function onDeviceReady() {
	var db = window.openDatabase("Database", "1.0", "mydata", 200000);
	db.transaction(populateDB, errorCB, successCB);
}

function populateDB(tx) {
	tx.executeSql('DROP TABLE IF EXISTS MYMEMO');
	tx.executeSql('CREATE TABLE IF NOT EXISTS MYMEMO ~~
		(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, ~~
		title TEXT, memo TEXT)');
}

function errorCB(err) {
	console.log("Error processing SQL: " + err.code);
}

function successCB() {
	console.log("Error processing SQL: " + err.code);
}
※関連コンテンツ

「PhoneGapによるAndroid/iPhoneアプリ開発入門」に戻る