Androidアプリ開発 SQLite データベースの作成、接続、削除処理

Androidアプリ開発では、SQLiteを使うことが多いです。
この記事は、AndroidアプリでSQLiteのデータベースの作成、接続、削除する方法を記載した記事です。
環境はAndroid 6.0 (API level 23) です。
環境
- OS X Yosemite
- android sdk 23
- Oracle jdk version 1.8.0_72
- Android Studio 2.1.2
難易度
初心者向け
サンプルコード
SQLite
SQLiteは埋込みSQLデータベースエンジンです。
通常のディスクファイルに直接読み書きを行います。小さなライブラリですが、全文検索にも対応した強力なデータベースです。
Androidでは、標準ライブラリとして利用できます。用途としては、データ保存やキャッシュに利用します。
実装
AndroidでSQLiteを操作するには、SQLiteOpenHelperとSQLiteDatabaseを使用します。
ContentProviderを使っても実装できますが、この記事ではContentProviderなしで実装します。
ContentProviderを使用しないほうが、多くのエンジニアが理解できるので、なるべく利用しない方向で実装しましょう。
DBOpenHelperクラス
最初に、DBOpenHelperクラスを作成します。
DBOpenHelperクラスはSQLiteOpenHelperを継承したクラスです。
このクラスは、データベースの作成と更新を行います。
public class DBOpenHelper extends SQLiteOpenHelper { public Context m_context; public static final String TAG = "DBOpenHelper"; public static final String DB_NAME = "android_sqlite_demo"; public static final int DB_VERSION = 1; public DBOpenHelper(final Context context) { super(context, DB_NAME, null, DB_VERSION); this.m_context = context; } @Override public void onCreate(final SQLiteDatabase db) { Log.d(TAG, "onCreate version : " + db.getVersion()); this.execFileSQL(db, "create_table.sql"); } @Override public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) { Log.d(TAG, "onUpgrade version : " + db.getVersion()); Log.d(TAG, "onUpgrade oldVersion : " + oldVersion); Log.d(TAG, "onUpgrade newVersion : " + newVersion); } /** * assetsフォルダのSQLファイルを実行する * @param db * @param fileName */ private void execFileSQL(SQLiteDatabase db, String fileName){ InputStream in = null; InputStreamReader inReader = null; BufferedReader reader = null; try { // 文字コード(UTF-8)を指定して、ファイルを読み込み in = m_context.getAssets().open(fileName); inReader = new InputStreamReader(in, "UTF-8"); reader = new BufferedReader(inReader); // ファイル内の全ての行を処理 String s; while((s = reader.readLine()) != null){ // 先頭と末尾の空白除去 s = s.trim(); // 文字が存在する場合(空白行は処理しない) if (0 < s.length()){ // SQL実行 db.execSQL(s); } } } catch (IOException e) { e.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } if (inReader != null) { try { inReader.close(); } catch (IOException e) { e.printStackTrace(); } } if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
■ 実装の解説
1. Databaseの作成
@Override public void onCreate(final SQLiteDatabase db) { Log.d(TAG, "onCreate version : " + db.getVersion()); this.execFileSQL(db, "create_table.sql"); }
アプリにSQLiteファイルがない場合、onCreateメソッドが呼びだされて、SQLiteファイルが作成されます。
SQLiteは、assetsフォルダに置いたsqlファイルを読み込んでsqlを実行します。
上記のコードでは、以下のcreate文を実行します。
CREATE TABLE IF NOT EXISTS dau (id integer,dau_date text,opening_price text,high_price text,low_price text,closing_price text,change_price text,deleted_at text,created_at text,updated_at text);
DBOpenHelper
次にDBHelperクラスを作成します。
このクラスは、上記で作成したDBOpenHelperクラスを使って、データベースに接続します。
public class DBHelper { public static final String TAG = "DBHelper"; public SQLiteDatabase db; private final DBOpenHelper dbOpenHelper; public DBHelper(final Context context) { this.dbOpenHelper = new DBOpenHelper(context); establishDb(); } private void establishDb() { if (this.db == null) { this.db = this.dbOpenHelper.getWritableDatabase(); } } public void cleanup() { if (this.db != null) { this.db.close(); this.db = null; } } /** * Databaseが削除できればtrue。できなければfalse * @param context * @return */ public boolean isDatabaseDelete(final Context context) { boolean result = false; if (this.db != null) { File file = context.getDatabasePath(dbOpenHelper.getDatabaseName()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { result = this.db.deleteDatabase(file); } } return result; } }
■ 実装の解説
1. Databaseの接続
public DBHelper(final Context context) { this.dbOpenHelper = new DBOpenHelper(context); establishDb(); } private void establishDb() { if (this.db == null) { this.db = this.dbOpenHelper.getWritableDatabase(); } }
this.dbOpenHelper.getWritableDatabase();でデータベースに接続します。
データベースの作成
上記のDBHelperとDBOpenHelperを使ってデータベースを作成します。
DBHelper dBHelper = null; try { dBHelper = new DBHelper(getApplicationContext()); } catch(Exception e) { Log.d(TAG, e.getMessage()); }
ログで確認します。

onCreateメソッドが呼び出されてデータベースが作成されたのが確認できました。
データベースの削除
上記で作成したデータベースを削除します。
DBHelper dBHelper = null; try { dBHelper = new DBHelper(getApplicationContext()); boolean result = dBHelper.isDatabaseDelete(getApplicationContext()); Log.d(TAG, " delete result : " + result); } catch(Exception e) { Log.d(TAG, e.getMessage()); }
上記の処理をログで確認します。

データベースが削除されたのが確認できました。
まとめ
Androidの開発でSQLiteを利用するケースは多いです。
他のアプリとの連携が必要ない場合は、ContentProviderを利用しない方が、開発者が理解しやすい保守性の高いアプリを作れると思います。