たぼさんの部屋

いちょぼとのんびり

T203 SqlDbConnection ver1.1 完成版

使い方

インスタンス生成
open
sql
close

instance

SqlDbConnection conn = new SqlDbConnection(context);

open

  • ReadOnly
conn.openReadOnly();
    • Writable
conn.openWritable();

sql

  • insert , update , delete
conn.execSQL(sql);
  • select
Cursor c = conn.selectSQL(sql);

close

conn.close();

SqlDbConnection.java

package com.efolab._lib;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
/**
 * @since 2012/12/7
 * @version 1.0
 * @author kamogashira
 *
 */
public class SqlDbConnction {
	private SQLiteDatabase db;
	private static final int DEFAULT_VERSION = 0;
	@SuppressWarnings("unused")
	private static final int NEW_VERSION = 1;
	private static int newVersion = DEFAULT_VERSION; // SQLiteDatabaseの初期値は0でセットされているので、初期値は同じにしておく。
	private static final int DB_MODE_PRIVATE = Context.MODE_PRIVATE; // このアプリだけがDBを操作できる
	private static final String DBNAME = "testdb";
	public static final String TABLENAME = "T_test";		//テーブル名はpublicにしておく。(他のクラスから参照できるように)
	private static Cursor cursor = null;
	private static String PATH;

	public SqlDbConnction(Context context) {
		//パッケージ名を取得してDBパスを生成する【openDatabase()用】
		String path1 = "/data/data/", path2 = "/databases/";
		String packageName = context.getPackageName();
		PATH = path1 + packageName + path2;
		
		
		
		db = context.openOrCreateDatabase(DBNAME, DB_MODE_PRIVATE, null);
		Log.v("DB","バージョン確認:getVersion()="+db.getVersion());
		// データベースのバージョン確認
		if (db.needUpgrade(newVersion)) {
			Log.v("DB", "テーブル定義の更新必要");
			createUpdateTable();//テーブルを削除して更新テーブルを再生成
			db.setVersion(newVersion);
		} else {
			Log.v("DB", "テーブル更新不要");
			// 初期はここにくる
			/*
			 * table存在確認
			 */
			if (isTableExists(TABLENAME) == false) {
				// テーブルがない
				Log.v("DB", TABLENAME + "のテーブルがない");
				// 初期のテーブル定義を使ってテーブル生成する
				createDefaultTable();// 初期テーブル定義に従って生成
			} else {
				// すでにテーブル生成されている
				Log.v("DB", TABLENAME + "のテーブルはある");
			}
		}
		Log.v("DB", "oldVersion=" + db.getVersion());
		
		db.close();
	}

	public boolean openReadOnly() {
		try {
			//XXX oepnDatabase()はPATHであることに注意!--openOrCreateDatabase()はDBNAMEだけ。
			db = SQLiteDatabase.openDatabase(PATH + DBNAME, null,
					SQLiteDatabase.OPEN_READONLY);
		} catch (Exception e) {
			// PATHが間違いかもしれない
			Log.e("open error", "" + e);
		}
		return true;
	}
	public boolean openWritable() {
		try {
			db = SQLiteDatabase.openDatabase(PATH + DBNAME, null,
					SQLiteDatabase.OPEN_READWRITE);
		} catch (Exception e) {
			// PATHが間違いかもしれない
			Log.e("open error", "" + e);
		}
		return true;
	}
	public Cursor selectSQL(String sql) {
		if (db.isOpen() && sql != null) {
			cursor = db.rawQuery(sql, null);
		} else {
			Log.e("SQLconnection", "select : dbがopenでない");
			cursor = null;
		}
		return cursor;
	}

	public boolean execSQL(String sql) {
		boolean ret = false;
		try {
			if (db.isOpen() && sql != null) {
				db.execSQL(sql);
				ret = true;
			} else {
				Log.e("SQLconnection", "select : dbがopenでない");
			}
		} catch (Exception e) {
			Log.e("SQLconnection", "execSQL:" + e);
		}
		return ret;
	}

	public void close() {
		if (cursor != null && cursor.isClosed() == false) {
			cursor.close();
		}
		if (db.isOpen() == true) {
			db.close();
		}
	}
	// 初期テーブルの生成
	private void createDefaultTable() {
		String sql;
		sql = "create table ";
		sql += TABLENAME;
		sql += " (";
		sql += "id INTEGER primary key autoincrement";
		sql += ", data INTEGER";
		sql += ", update_date TIMESTAMP DEFAULT (DATETIME('now','localtime'))";
		sql += ");";

		db.execSQL(sql);
	}

	// 更新テーブルの生成(必要なときに記述する)
	private void createUpdateTable() {
		// いまは、初期テーブルをドロップして再度初期テーブルを生成するように記述しておく
		String dropSql;
		dropSql = "drop table " + TABLENAME;
		// テーブルを削除
		db.execSQL(dropSql);

		// TEST 再度初期テーブルを生成
		createDefaultTable(); // 更新が必要なときはここの記述を変更すること。
	}

	/**
	 * テーブルの存在確認
	 */
	private boolean isTableExists(String name) {
		boolean ret = false;
		String kakunin_sql = "select count(*) from sqlite_master where type='table' and name= '"
				+ name + "';";
		Log.v("DbConnection", "kakunin_sql=" + kakunin_sql);
		// db = dbHelper.getReadableDatabase();
		Cursor c = db.rawQuery(kakunin_sql, null);
		c.moveToFirst();
		Log.v("DbConnection", "テーブル存在確認結果:" + c.getInt(0));
		if (c.getInt(0) == 1) {
			// テーブルが存在する
			ret = true;
		}
		c.close();
		return ret;
	}
}