たぼさんの部屋

いちょぼとのんびり

MDBHelper ライブラリ完成 ver1

MDBHelper.class

package com.efolab.mdbhelper;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast;

public class MDBHelper extends SQLiteOpenHelper {
	private static final String CLASSNAME = MDBHelper.class.getSimpleName();
	private static String name = "DB_"+CLASSNAME;
	private static CursorFactory factory = null;
	public static final String TABLE_NAME = "T_" + CLASSNAME;
	public static final String SPACE = " ";
	private String CREATE_TABLE = null;
	@SuppressWarnings("unused")
	private Context context;
	private SQLiteDatabase mDB = null;
	/**
	 * 
	 * @param context
	 * @param sql
	 * @param version
	 */
	public MDBHelper(Context context , String sql ,int version) {
		super(context, name, factory, version);
		// TODO Auto-generated constructor stub
		this.context = context;
		this.CREATE_TABLE = sql;
	}
	public void insert(String sql){
		mDB = this.getWritableDatabase();
		try{
			mDB.execSQL(sql);
			
		}catch(SQLException e){
			Log.e(CLASSNAME,""+e);
		}finally{
			if(mDB.isOpen()){
				mDB.close();
			}
		}
	}
	public List<Map<String,Object>> select(String sql){
		List<Map<String,Object>> ret = new ArrayList<Map<String,Object>>();
		HashMap<String,Object> map = null;
		Cursor c = null;
		try{
			mDB = this.getReadableDatabase();
			c = mDB.rawQuery(sql, null);
			if(c.getCount() > 0){
				c.moveToFirst();
				for(int i=0;i<c.getCount();i++){
					map = new HashMap<String , Object>();
					//mapにデータを格納:格納のデータの順序は影響なし
					for(int j=0;j<c.getColumnCount();j++){
						map.put(c.getColumnName(j), c.getString(j));
					}
					ret.add(map);
					c.moveToNext();
				}
			}
		}catch(SQLException e){
			Log.e(CLASSNAME,""+e);
		}finally{
			if(c != null && !c.isClosed()){
				c.close();
			}
			if(mDB.isOpen()){
				mDB.close();
			}
		}
		return ret;
	}
	public int getCount(){
		int ret = 0;
		Cursor c = null;
		String sql = "select count(*) from" + SPACE + TABLE_NAME +";";
		try{
			mDB = this.getReadableDatabase();
			c = mDB.rawQuery(sql, null);
			c.moveToFirst();	//必要
			ret = c.getInt(0);
		}catch(SQLException e){
			Log.e(CLASSNAME,""+e);
		}finally{
			if(c != null && !c.isClosed()){
				c.close();
			}
			if(mDB.isOpen()){
				mDB.close();
			}
			
		}
		Log.v("",""+ret);
		return ret;
	}

	/**
	 * テーブルの存在確認
	 */
	private boolean isTableExists(SQLiteDatabase db, String name) {
		boolean ret = false;
		String kakunin_sql = "select count(*) from sqlite_master where type='table' and name= '"
				+ name + "';";
		
		Cursor c = null;
		try{
			c = db.rawQuery(kakunin_sql, null);
			c.moveToFirst();
			Log.v("DbConnection", "テーブル存在確認結果:" + c.getInt(0));
			if (c.getInt(0) == 1) {
				// テーブルが存在する
				ret = true;
			}
			
		}catch(SQLException e){
			Log.e(CLASSNAME,""+e);
		}finally{
			if(c != null && !c.isClosed()){
				c.close();
			}
		}
		return ret;
	}
	@Override
	public void onCreate(SQLiteDatabase db) {
		//db を明示的にopenしておく必要なし。
		try {
			db.execSQL(CREATE_TABLE);
			
		} catch (SQLException e) {
			Log.e(CLASSNAME, "e" + e);
		}
		
		//テーブルが生成できたかどうか確認する
		if(isTableExists(db, TABLE_NAME)){
			Log.v(CLASSNAME,"テーブル生成完了");
		}else{
			Log.e(CLASSNAME,"onCreateでテーブルを生成できませんでした");
		}
		
		/*
		 * db.close() 不要
		 * 明示的にclose()するとエラーが発生する
		 * java.lang.IllegalStateException: database not open	
		 * at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:555)
		 */
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		Toast.makeText(context, "onUpdate", Toast.LENGTH_SHORT).show();
		String sql = "DROP TABLE IF EXISTS " + TABLE_NAME;
		try{
			db.execSQL(sql);
			this.onCreate(db); // dropして再作成
			
		}catch(SQLException e){
			Log.e(CLASSNAME,""+e);
		}
	}
}