ホーム > カテゴリ > Java・Android >

SQLiteによるデータベース操作(SELECT/INSERT/UPDATE/DELETE/トランザクション) [Android Studio]

Android Studioの使い方(目次)

Androidアプリが標準で利用できる「SQLite」によるデータベース操作です。データベースの作成、接続、テーブルの検索/更新/削除、トランザクションのサンプルをご紹介します。

目次

1. DEMO
2. 画面設計
3. コーディング

1. DEMO

今回はログキャットでSQLのSELECT文の結果を表示します。

※ログの種類は「Info」、検索は「SQLITE」にして下さい。

2. 画面設計

Buuttonを3つ配置します。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="INSERT"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/button2"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="SELECT"
        app:layout_constraintEnd_toStartOf="@+id/button3"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/button"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="UPDATE"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/button2"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

3. コーディング

SQLiteOpenHelperを継承したヘルパークラスで「DB接続」を行います。接続にはデータベース名(ファイル名)、バージョンの定義が必要です。また、ユーザーID、パスワードなどは必要ありません。

テーブルなどの操作はSQLiteDatabaseクラスを使用しています。

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteStatement;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    static final String DB_NAME = "sample.db";
    static final int DB_VERSION = 1;

    // データベースの接続操作を行うヘルパークラス
    private static class MySQLiteOpenHelper extends SQLiteOpenHelper {

        // コンストラクタ
        public MySQLiteOpenHelper(Context context){
           super(context, DB_NAME, null, DB_VERSION);
        }

        // データベースが存在しない場合に一度だけ呼ばれる
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE mst_sample (" +
                       // 主キー(自動採番) ※Androidでは主キーは _id とする
                       "_id INTEGER PRIMARY KEY AUTOINCREMENT, "+
                       "title TEXT," +
                       "price INTEGER NOT NULL);");
        }

        // DB_VERSIONが異なる場合に自動で実行される
        // ※アプリのバージョンアップなどでテーブル定義を変更する場合は
        // ※DB_VERSIONのバージョンを変更するとこのメソッドが呼ばれます。
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE mst_sample;");
            onCreate(db);
        }
    }

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // INSERT
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = null;

                MySQLiteOpenHelper helper = new MySQLiteOpenHelper(MainActivity.this);
                try {
                    db = helper.getWritableDatabase();
                    
                    // トランザクションの開始
                    db.beginTransaction();

                    // プリペアドステートメント
                    SQLiteStatement stmt = db.compileStatement(
                                        "INSERT INTO mst_sample(title,price) VALUES(?,?)");
                    stmt.bindString(1,"あいうえお");
                    stmt.bindLong(2,1000);

                    // SQLの実行
                    stmt.executeInsert();

                    // コミット
                    db.setTransactionSuccessful();
                }catch (Exception e){
                    // エラー時(ロールバックは必要ありません。)
                }finally{
                    if(db != null) {
                        db.endTransaction();
                        db.close();
                    }
                }
            }
        });

        // SELECT
        findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               SQLiteDatabase db = null;

               MySQLiteOpenHelper helper = new MySQLiteOpenHelper(MainActivity.this);
               try {
                   db = helper.getReadableDatabase();

                   Cursor cursor = db.rawQuery("SELECT * FROM mst_sample;",null);

                   // 行毎にデータを読み込む
                   while(cursor.moveToNext()){

                       int index = cursor.getColumnIndex("_id");
                       String _id = String.valueOf(cursor.getLong(index));

                       index = cursor.getColumnIndex("title");
                       String title = cursor.getString(index);

                       index = cursor.getColumnIndex("price");
                       String price = String.valueOf(cursor.getLong(index));

                       // ログに出力する(Android Studioの下部にあるログキャットで確認可能)
                       Log.i("SQLITE", "_id : " + _id + " " +
                                                       "text : " + title + " " +
                                                       "price : "+ price);
                   }
                 }finally{
                   if(db != null) {
                       db.close();
                   }
               }
           }
        });

       // UPDATE
       findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               SQLiteDatabase db = null;

               MySQLiteOpenHelper helper = new MySQLiteOpenHelper(MainActivity.this);
               try {
                   db = helper.getWritableDatabase();

                   // トランザクションの開始
                   db.beginTransaction();

                   // プリペアドステートメント
                   SQLiteStatement stmt = db.compileStatement(
                           "UPDATE mst_sample SET title='かきくけこ' WHERE title=?");

                   stmt.bindString(1, "あいうえお");

                   // SQLの実行
                   stmt.executeUpdateDelete();

                   // コミット
                   db.setTransactionSuccessful();

               }catch (Exception e){
                  // エラー時(ロールバックは必要ありません。)
               }finally{
                   if(db != null) {
                       db.endTransaction();
                       db.close();
                   }
               }
           }
       });
   }
}

今回のテーブル操作はSELECT/INSERT/UPDATEです。更新系にはプリペアドステートメント及びトランザクションを使用しています。

※DELETEはUPDATEの手法と同様です。





関連記事



公開日:2018年05月21日
記事NO:02661