SQLiteデータベースをプログラム的に作り、使う
Creating and Using SQLite Databases Programmatically
関係するデータを保存するためには、データベースを使うのが
かなり効果的です。例えば、学校のすべての生徒の結果を保存するには、
生徒の結果を表現するデータベースを使うのがかなり効果的で、
データベースを使えばあとで、指定の生徒の結果を
データベース問い合わせを使って検索ができます。
さらに、異なるデータセットの間を指定の関係性でデータを
統合させることがデータベースを使うことでできるようになります。
AndroidはSQLiteデータベースシステムを使います。
アプリケーション用につくるデータベースは、
アプリケーション自身にだけアクセスでき、他のアプリケーションは、
同じデータベースにアクセスできないようになります。
ここでは、開発するアプリケーションの中に、プログラム的に
データベースを作る方法を示します。
Androidでは、アプリケーションの中にプログラム的に作った
SQLiteデータベースは通常、
/data/data/<パッケージ名>/databasesフォルダに保存されます。
データベースとやり取りをする良い慣例は、データにアクセスしている
すべての複雑さをカプセル化するためのヘルパークラスを作ります。
それで、呼び出しているコードを透明化します。
このため、ここでは、SQLiteデータベースを使い、閉じ、開き、作る
DBAdapter.javaと名付けた、DBAdapterを呼び出すヘルパークラスを
作ります。
例えば、これからMyDBというデータベースを作り、MyDBにcontactsと
名付けた1つのテーブルを含ませます。
contactsテーブルには3つの列を持たせます。
列の名は、_id、name、emailとします。
DBAdapterクラスの内容な以下のようにします。
package net.learn2develop.databases;
import android.content.ContentValues;
import android.content.Content;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlited.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBAdapter{
static final String KEY_ROWID = "/id";
static final String KEY_NAME = "NAME";
static final String KEY_EMAIL = "email";
static final String TAG = "DBAdapter";
static final String DATABASE_NAME = "MyDB";
static final String DATABASE_TABLE = "contacts";
static final int DATABASE_VERSION =1;
static final String DATABASE_CREATE = "create table contacts(_id
integet primary key autoincrement," +
"email text not null);
final Context context;
DatabaseHelper DBHelper;
SQLiteDatabase db;
public DBAdapter(Context ctx){
this.context = ctx;
DBHelper = new DatabaseHelper(context);
private static class DatavaseHelper extends SQLiteOpenHelper{
DatabaseHelper(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db){
try{
db.execSQL(DATABASE_CREATE);
}catch(SQLException e){
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
Log.w(TAG, "upgrading datavase from version" + oldVersion + " to " +
db.execSQL("DROP TABLE IF EXISTS contacts");
onCreate(db);
}
}
//---opens the database---
public DBAdapter.getWritableDatabase();
return this;
}
//---closes the database---
public void close();
DBHelper.close();
}
//---insert a contact into the database---
public long insertContact(String name, String email){
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_NAME, name);
initialValues.put(KEY_EMAMIL, email);
return db.insert(DATABASE_TABLE, null, initialValues);
}
//---deletes a particular contact---
public voolean deleteContact(long rowId){
return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
//---retrieves all the contacts---
public Cursor getAllContacts(){
return db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME,
KEY_EMAIL),null, null, null, null, null);
}
//---retrieves a particular contact---
public Cursor getContact(long rowId) throws SQLException{
Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {
KEY_ROWID, KEY_NAME, KEY_EMAIL},KEY_ROWID + "=" + rowId,
null, null, null, null, null);
if(mCursor != null){
MCursor.moveToFirst();
}
return mCursor;
}
//---updates a contact---
public boolean updateContaxt(long rowId, String name, String email){
ContentValues args = new ContentValues();
args.put(KEY_NAME, name);
args.put(KEY_EMAIL, email);
return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
}
}
このクラスは以下のようになっています。
●まずいくつかの定数をデータベースに作ろうとしているテーブル用に
いろんなフィールドを含むいくつかの定数を定義してます。
●MyDBデータベース内にcontaxtsテーブルを作っていくために、
SQLステートメントを含むDATABASE_CREATE定数を宣言しました。
●DBAdapterクラス内に、SQLiteOpenHelperクラスを拡張した
プライベートクラスも加えています。SQLiteOpenHelperクラスは
データベース制作用のAndroidにあるヘルパークラスで、
データベースのバージョンを管理します。特に、
onCreate()とonUpgrade()メソッドをオーバライドします。
onCreate()クラスは必要なデータベースが
無い場合に新しいデータベースを作ります。
onUpgrade()クラスはデータベースに更新が、
必要なときに呼び出されます。このonUpgrade()メソッドは
DATABASE_VERSION定数で定義された値をチェックすることで
データベースの更新を成し遂げます。onUpgrade()メソッドで
更新作業を実行するには、単純にテーブルにドロップし、
再度作ればOKです。
そしてデータベースを開き、閉じるためにいろんなメソッドを定義し、
同じようにテーブルにある行を削除・編集・追加をいろんなメソッドで
行います。
ちょっと注釈
Androidは問い合わせた結果を返すためCusorクラスを使います。
データベース問合せからの結果をセットするためのポインタとして
考えてください。Cursorクラスを使うことで、
必要ならAndroidにデータベースの行や列をさらに効果的に
管理できるようにしてくれます。
●ContentValuesオブジェクトキー/値のペアを保存するために使います。
そのput()メソッドは異なるデータ型のキーと値を挿入できるように
してくれます。
DBAdapterクラスを使って開発するアプリケーションにデータベースを
作るためには、DBAdapterクラスのインスタンスを作ります。
public DBAdapter(Context ctx){
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
DBAdapterクラスのコンストラクタは、新しいデータベースを作るために
DatabaseHelperクラスのインスタンスを作ります。
DatabaseHelper(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
今定義したばかりのDBAdapterクラスを使うためには、
AddContact()
GetContacts()
GetContact()
UpdateContact()
DeleteContact()
DisplayContact()などのメソッドを使います。
package net.learn2develop.databases;
import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends Activity{
DBAdapter db;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
db = new DBAdapter(this);
AddContact();
GetContacts();
GetContact();
UpdateContact();
DeleteContact();
}
public void AddContact(){
//---add a contact---
db.open();
if (db.insertContact("database", "パッケージ名") >= 0){
Toast.makeText(this, "Add successful", Toast.LENGTH_LONG).show();
}
if(db.insertContact("database2", "HPアドレス") >= 0){
Toast.makeText(this, "Add successful", Toast.LENGTH_LONG).show();
}
db.close();
}
public void GetContacts(){
//---get all contacts---
db.open();
Cursor c = db.getAllContacts();
if(c.moveToFirst()){
do{DisplayContact(c);
}while(c.moveToNext());
}
sb.close();
}
public void GetContact(){
//---get a contact---
db.open();
Cursor c = db.getContact(2);
if(c.moveToFirst()) DisplayContact(c);
else
Toast.makeText(this, "Nocontaxt found", Toast.LENGTH_LONG).show();
db.close();
}
public void UpdateContacty(){
//---update a contact---
db.open();
if(db.updateContact(1, "database3", "メールアドレス"))
Toast.makeText(this, "Update successful", Toast.LENGTH_LONG).show();
else
Toast.makeText(this, "Update failed", Toast.LENGTH_LONG).show();
db.close();
}
public void DeleteContact(){
db.open();
if(db.deleteContact(1))
Toast.makeText(this, "Delete successful", Toast.LENGTH_LONG).show();
else
Toast.makeText(this, "Delete failed", Toast.LENGTH_LONG).show();
db.close();
}
public void DisplayContact(Cursor c){
Toast.makeText(this, "id: " + c.getString(0) + "\n" +
"Name: " + c.getString(1) + "\n" +
"Email: " + c.getString(2), Toast.LENGTH_LONG).show();
}
}
データベースが作られた時には、そのデータベースは
/data/data/<パッケージ名>/databasesフォルダの中に
見つけることができます。
|
【用語解説】
XML
HTMLと同じような言語ですが、
すべての型の複雑なデータ構造を
送信するための設計ができる
ファイル型式。
オブジェクト
ある手続きを持った
データアイテムで、
他の手続きと関連づけされるもの
metaタグ
ウェブページに与える
情報の宣言につかわれ
検索エンジン・ウェブアプリ
などにウェブページの内容を
伝える役目をする。
metaタグの内容は
ページ内に表示されない。
コンストラクタ
オブジェクト指向
プログラミングで使われ
新しいオブジェクトが
作られ時に呼び出される
メソッドのこと。
クラス
オブジェクト指向
プログラミングでの
オブジェクトの型
オブジェクト指向プログラミング
プログラミングの
方式のことで、
プログラマはデータ型を
定義できるだけでなく
自動的にデータ型と
メソッドを関連付け
できる
アクティビティ
Androidにおける
アクティビティは
Androidアプリの画面に
相当するもの
ボタンやウェブページ
など表示されている
すべてのもののこと。
view
Androidのアプリを開発する
上で使う部品のことで、
トリガボタン・イメージボタン
チェックボックスなどのこと。
UI
ユーザインターフェースのこと。
Bind(バインド)
シンボルとデータを
関連させるため
または、データの一片と
他のものを関連させること。
以下は例。
・変数に値を入れる。
(変数の初期化)
・特定のEthernetポートと
ネットワークプロトコルを
関連付けする。
・Javaの変数のセット上に
XML文書を配置すること。
または、ほかの
プログラミング言語でも。
|