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

2016年06月26日(編集2016年06月26日)
このエントリーをはてなブックマークに追加

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

難易度

初心者向け

サンプルコード

Android-SQLite-Demo

SQLite

SQLiteは埋込みSQLデータベースエンジンです。
通常のディスクファイルに直接読み書きを行います。小さなライブラリですが、全文検索にも対応した強力なデータベースです。
Androidでは、標準ライブラリとして利用できます。用途としては、データ保存やキャッシュに利用します。

実装

AndroidでSQLiteを操作するには、SQLiteOpenHelperSQLiteDatabaseを使用します。
ContentProviderを使っても実装できますが、この記事ではContentProviderなしで実装します。

ContentProviderを使用しないほうが、多くのエンジニアが理解できるので、なるべく利用しない方向で実装しましょう。

DBOpenHelperクラス

最初に、DBOpenHelperクラスを作成します。
DBOpenHelperクラスはSQLiteOpenHelperを継承したクラスです。
このクラスは、データベースの作成と更新を行います。

{project_folder}/app/{package}/util/DBOpenHelper.java
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文を実行します。

{project_folder}/app/{package}/assets/create_table.sql
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クラスを使って、データベースに接続します。

{project_folder}/app/{package}/util/DBHelper.java
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を使ってデータベースを作成します。

{project_folder}/app/{package}/MainActivity.java
                DBHelper dBHelper = null;
                try {
                    dBHelper = new DBHelper(getApplicationContext());
                } catch(Exception e) {
                    Log.d(TAG, e.getMessage());
                }
        

ログで確認します。

android studio console log

onCreateメソッドが呼び出されてデータベースが作成されたのが確認できました。

データベースの削除

上記で作成したデータベースを削除します。

{project_folder}/app/{package}/MainActivity.java
                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 studio console log

データベースが削除されたのが確認できました。

まとめ

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

関連記事

タグ検索で調べてみよう

Android6.0 SQLite