ウェブアプリケーション,インジェクション,コマンドインジェクション

Androidアプリ開発 データを持続させる

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フォルダの中に
見つけることができます。

ホーム
便利堂ロゴ
inserted by FC2 system