Androidアプリ開発 SQLite テーブルの検索、登録、更新、削除

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

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データベースの接続方法は、この記事で説明しています。
この記事は、データベースの接続は可能になっている前提で説明します。

実装

SQLiteデータベースにダウの株価を管理するdauテーブルを用意します。

{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);
        

上記のテーブルの操作を実行します。

モデルヘルパーの実装

テーブルを操作するメソッドを集めたモデルのヘルバークラスを用意します。
ここでは、Dauモデルを操作するDauHelperクラスを作成します。

{project_folder}/app/{package}/model/DauHelper.java
/**
 * Copyright (C) 2016 Programming Java Android Development Project
 * Programming Java is
 *
 *      http://java-lang-programming.com/
 *
 * Model Generator version : 1.0.3
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.java_lang_programming.android_sqlite_demo.model;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.util.Log;

import com.java_lang_programming.android_sqlite_demo.BuildConfig;
import com.java_lang_programming.android_sqlite_demo.util.DBHelper;

import java.util.ArrayList;
import java.util.List;

/**
 * An ModelHelper class for DauHelper
 */
public class DauHelper {

    public static final String TAG = "DauHelper";

    /**
     * return Dau List
     *
     * @param context you should use ApplicationContext. ApplicationContext can get getApplicationContext().
     * @return the list objects of rows, null otherwise.
     */
    public static List<Dau> getDauList(final Context context) {
        List<Dau> list = new ArrayList<Dau>();
        Dau dau = null;
        Cursor c = null;
        DBHelper dBHelper = null;
        try {
            dBHelper = new DBHelper(context);

            StringBuffer sql = new StringBuffer();
            sql.append("select ");
            sql.append(" " + Dau.TABLE_NAME_OMISSION + "." + Dau.COL[0] + ",");
            sql.append(" " + Dau.TABLE_NAME_OMISSION + "." + Dau.COL[1] + ",");
            sql.append(" " + Dau.TABLE_NAME_OMISSION + "." + Dau.COL[2] + ",");
            sql.append(" " + Dau.TABLE_NAME_OMISSION + "." + Dau.COL[3] + ",");
            sql.append(" " + Dau.TABLE_NAME_OMISSION + "." + Dau.COL[4] + ",");
            sql.append(" " + Dau.TABLE_NAME_OMISSION + "." + Dau.COL[5] + ",");
            sql.append(" " + Dau.TABLE_NAME_OMISSION + "." + Dau.COL[6] + ",");
            sql.append(" " + Dau.TABLE_NAME_OMISSION + "." + Dau.COL[7] + ",");
            sql.append(" " + Dau.TABLE_NAME_OMISSION + "." + Dau.COL[8] + ",");
            sql.append(" " + Dau.TABLE_NAME_OMISSION + "." + Dau.COL[9]);
            sql.append(" from ");
            sql.append(" " + Dau.TABLE_NAME + " " + Dau.TABLE_NAME_OMISSION);

            if (BuildConfig.DEBUG) {
                Log.d(TAG, "sql : " + sql.toString());
            }

            c = dBHelper.db.rawQuery(sql.toString(), null);

            boolean isResult = c.moveToFirst();

            while (isResult) {
                dau = new Dau();
                dau.id = c.getString(0);
                dau.dau_date = c.getString(1);
                dau.opening_price = c.getString(2);
                dau.high_price = c.getString(3);
                dau.low_price = c.getString(4);
                dau.closing_price = c.getString(5);
                dau.change_price = c.getString(6);
                dau.deleted_at = c.getString(7);
                dau.created_at = c.getString(8);
                dau.updated_at = c.getString(9);
                list.add(dau);
                isResult = c.moveToNext();
            }

        } catch (Exception e) {
            Log.e(TAG, "error occured!! cause : " + e.getMessage());
        } finally {

            if (c != null) {
                c.close();
            }

            if (dBHelper != null) {
                dBHelper.cleanup();
            }
        }
        return list;
    }

    /**
     * return Dau
     *
     * @param context you should use ApplicationContext. ApplicationContext can get getApplicationContext().
     * @param id Dau's id
     * @return the object of rows affected if id is passed in, null otherwise.
     */
    public static Dau getDau(final Context context, final String id) {
        Dau dau = null;
        Cursor c = null;
        DBHelper dBHelper = null;
        try {
            dBHelper = new DBHelper(context);

            StringBuffer sql = new StringBuffer();
            sql.append("select ");
            sql.append(" " + Dau.TABLE_NAME_OMISSION + "." + Dau.COL[0] + ",");
            sql.append(" " + Dau.TABLE_NAME_OMISSION + "." + Dau.COL[1] + ",");
            sql.append(" " + Dau.TABLE_NAME_OMISSION + "." + Dau.COL[2] + ",");
            sql.append(" " + Dau.TABLE_NAME_OMISSION + "." + Dau.COL[3] + ",");
            sql.append(" " + Dau.TABLE_NAME_OMISSION + "." + Dau.COL[4] + ",");
            sql.append(" " + Dau.TABLE_NAME_OMISSION + "." + Dau.COL[5] + ",");
            sql.append(" " + Dau.TABLE_NAME_OMISSION + "." + Dau.COL[6] + ",");
            sql.append(" " + Dau.TABLE_NAME_OMISSION + "." + Dau.COL[7] + ",");
            sql.append(" " + Dau.TABLE_NAME_OMISSION + "." + Dau.COL[8] + ",");
            sql.append(" " + Dau.TABLE_NAME_OMISSION + "." + Dau.COL[9]);
            sql.append(" from ");
            sql.append(" " + Dau.TABLE_NAME + " " + Dau.TABLE_NAME_OMISSION);
            sql.append(" where " + Dau.TABLE_NAME_OMISSION + "." + Dau.COL[0] + "="" +  id + """);
            if (BuildConfig.DEBUG) {
                Log.d(TAG, "sql" + sql.toString());
            }

            c = dBHelper.db.rawQuery(sql.toString(), null);

            boolean isResult = c.moveToFirst();

            if (isResult) {
                dau = new Dau();
                dau.id = c.getString(0);
                dau.dau_date = c.getString(1);
                dau.opening_price = c.getString(2);
                dau.high_price = c.getString(3);
                dau.low_price = c.getString(4);
                dau.closing_price = c.getString(5);
                dau.change_price = c.getString(6);
                dau.deleted_at = c.getString(7);
                dau.created_at = c.getString(8);
                dau.updated_at = c.getString(9);
                isResult = c.moveToNext();
            }

        } catch (Exception e) {
            Log.e(TAG, "error occured!! cause : " + e.getMessage());
        } finally {

            if (c != null) {
                c.close();
            }

            if (dBHelper != null) {
                dBHelper.cleanup();
            }
        }
        return dau;
    }

    /**
     * update
     *
     * @param context you should use ApplicationContext. ApplicationContext can get getApplicationContext().
     * @param contentValues
     * @param id is primary key
     * @return the number of rows affected
     */
    public static long update(final Context context, final ContentValues contentValues, String id) {
        DBHelper dBHelper = new DBHelper(context);
        long result = dBHelper.db.update(Dau.TABLE_NAME, contentValues, Dau.COL[0] + "=" + id, null);
        dBHelper.cleanup();
        return result;
    }

    /**
     * insert
     *
     * @param context you should use ApplicationContext. ApplicationContext can get getApplicationContext().
     * @param contentValues
     * @return the row ID of the newly inserted row, or -1 if an error occurred
     */
    public static long insert(final Context context, final ContentValues contentValues) {
        DBHelper dBHelper = new DBHelper(context);
        long result = dBHelper.db.insert(Dau.TABLE_NAME, null, contentValues);
        dBHelper.cleanup();
        return result;
    }

    /**
     * delete
     *
     * @param context you should use ApplicationContext. ApplicationContext can get getApplicationContext().
     * @param id is primary key
     * @return the number of rows affected if a whereClause is passed in, 0
     *         otherwise. To remove all rows and get a count pass "1" as the
     *         whereClause.
     */
    public static long delete(final Context context, String id) {
        DBHelper dBHelper = new DBHelper(context);
        int result = dBHelper.db.delete(Dau.TABLE_NAME, Dau.COL[0] + "=" + id, null);
        dBHelper.cleanup();
        return result;
    }
}
        

* 上記のコードは、当サイトのサービス機能  Model Generator で作成しています。

Model Generator

検索の実装

SQLiteの検索には、select文を利用します。
一覧を取得するgetDauListと、主キーからオブジェクトを取得するgetDauを用意してます。

検索sqlは、コード内で直接記述して実行します。

select  D.id, D.dau_date, D.opening_price, D.high_price, 
D.low_price, D.closing_price, D.change_price, 
D.deleted_at, D.created_at, D.updated_at from  Dau D where D.id="1"
        

一覧の場合は、whileループでListオブジェクトを作成します。

登録の実装

SQLiteの登録には、insertメソッドを利用します。
引数にテーブル名とContentValuesのオブジェクトを渡します。

ContentValues contentValues = new ContentValues();
contentValues.put(Dau.COL[0] ,"2");
contentValues.put(Dau.COL[1], "20160601");
contentValues.put(Dau.COL[2], "7000");
contentValues.put(Dau.COL[3], "7200");
contentValues.put(Dau.COL[8], System.currentTimeMillis());
contentValues.put(Dau.COL[9], System.currentTimeMillis());
long result = DauHelper.insert(getApplicationContext(), contentValues);
        

結果はlong型で、登録したデータのIDを取得します。

更新の実装

SQLiteの更新には、updateメソッドを利用します。
引数にテーブル名, ContentValuesのオブジェクト, sqlのwhere文を渡します。

ContentValues contentValues = new ContentValues();
contentValues.put(Dau.COL[0] ,"2");
contentValues.put(Dau.COL[1], "20160601");
contentValues.put(Dau.COL[2], "7300");
contentValues.put(Dau.COL[3], "8000");
contentValues.put(Dau.COL[9], System.currentTimeMillis());
long result = DauHelper.update(getApplicationContext(), contentValues, "1");
        

結果はlong型で、更新したデータのIDを取得します。

削除の実装

SQLiteの削除には、deleteメソッドを利用します。
引数にテーブル名, sqlのwhere文を渡します。

long result = DauHelper.delete(getApplicationContext(), "2");
        

以上で、検索、登録、更新、削除処理が全て実行できます。

まとめ

Androidの開発でsqliteを利用するケースは多いです。
検索、登録、更新、削除処理は基本なので、使いこなせるようにしましょう。

当サイトのサービスも利用してみてください。

Model Generator

関連記事

タグ検索で調べてみよう

Android6.0 SQLite