LoginSignup
7
7

More than 5 years have passed since last update.

Android開発でデータベース接続を使ってみた

Posted at

はじめに

こんにちは。某学校でプログラミング等の勉強中のサーバーサイドのプログラマーのワタタクです。:relaxed:
今回はWEBプログラミングではなく、Androidを開発していきたいと思います。

対象者

  • Javaがそこそこ書ける人。
  • Android開発においてもそこそこできる人。

利用手順

①DBのヘルパークラスを用意する。
②アクティビティでヘルパークラスからDB接続オブジェクト(SQLiteDatabaseオブジェクト)をもらう。
③DB接続オブジェクトを使ってSQLを実行していく。

DBのヘルパークラスの作り方

SQLiteOpenHelperクラス継承して作る。
この際三つのメソッドを実装する。
⒈コンストラクタ
⒉onCreate()
⒊onUpgrade()

⒈コンストラクタ

コンストラクタを作成してその中で、supper(4つの引数)を記述する。

<引数1>

コンテキスト
*コンテキストはこのクラスでは用意できないため、このクラスを使うアクティビティから引数としてもらう。

<引数2>

使用するデータベースファイル名

<引数3>

カーソルファクトリーオブジェクト
*通常はnullでよい

<引数4>

DBのヴァージョン番号
*整数で1始まり。
*Androidは内部DBがヴァージョン番号と一緒に管理されているので、渡す番号より内部の番号が小さい時にonUpgrade()が実行される。

⒉onCreate()

*内部にデータベースが存在しないときに一回だけ実行されるメソッド。
*CREATE TABLEなどの初期設定に必要なSQLをここに書く。
*引数のdbでのexecSQL()を使ってSQL文実行。

⒊onUpgrade()

以下の第二、第三引数の違いを利用してALTER TABLEなどのDB内部構造を変更する。
第一:DB接続オブジェクト。
第二:現在の内部番号。
第三:コンストラクタで設定した番号。

DBヘルパークラスの例

DatabaseHelper.java
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "データベース名";
    private static final int DATABASE_VERSION = 1;

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db ) {
        StringBuffer sb = new StringBuffer();
        sb.append("CREATE TABLE テーブル名 (");
        sb.append("_id INTEGER PRIMARY KEY AUTOINCREMENT, ");
        sb.append("content TEXT, ");
        sb.append(");");
        String sql = sb.toString();

        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

データアクセス

基本手順

①ヘルパーオブジェクト生成
②ヘルパーからDB接続オブジェクトをもらう。
③データ処理
④DB接続オブジェクトの解放

〜〜〜〜Activity.java
① DatabaseHelper helper = new DatabaseHelper(コンテキスト);
② SQLiteDatabase db = helper.getWritableDatabase();
try {

    //DB処理

} catch(Exception ex) {

    Log.e("MemoPad", ex.toString());

} finally {

    db.close();

}

更新系(INSERT,UPDATE,DELETE)

①SQL文字列を生成

②ステートメントオブジェクトをもらう

SQLiteStatement stmt = db.compileStatement("SQL文字列");

③変数のバインド

stmt.bindデータ型(?の順番, 値);

④SQLを実行する

  • INSERT
stmt.executeInsert();
  • UPDATE,DELETE
stmt.executeUpdateDelete();

参照系(SELECT)

①SQL文字列を生成

②SQLを実行する

 Cursor cursor = db.rawQuery("SQL文字列", null);

③Cursorをループする

while (cursor.moveToFirst()) {}

*あきらかに結果が1行の時はif (cursor.moveToFirst()) {}

④各行のデータを取得する

int 変数 = cursor.getColumnIndex("カラム");

String カラム = cursor.getカラムのデータ型(変数);

データアクセスの例

*Memoテーブルがあるとしてそれを操作するとする

DataAccess.java

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteStatement;

import java.sql.Timestamp;

public class DataAccess {
    public static Memo findByPK(SQLiteDatabase db, int id) {
        String sql = "SELECT _id, title, content, update_at FROM memos WHERE _id = " + id;
        Cursor cursor = db.rawQuery(sql, null);
        Memo result = null;
        if (cursor.moveToFirst()) {
            int idxTitle = cursor.getColumnIndex("title");
            int idxContent = cursor.getColumnIndex("content");
            int idxUpdateAt = cursor.getColumnIndex("update_at");
            String title = cursor.getString(idxTitle);
            String content = cursor.getString(idxContent);
            String updateAtStr = cursor.getString(idxUpdateAt);

            Timestamp updateAt = Timestamp.valueOf(updateAtStr);

             /*
             *セッター
             */
            result = new Memo();
            result.setId(id);
            result.setTitle(title);
            result.setContent(content);
            result.setUpdateAt(updateAt);

        }
        return result;
    }

    public static int update(SQLiteDatabase db, int id, String title, String content) {
        String sql = "UPDATE memos SET title = ?, content = ?, update_at = datetime('now') WHERE _id = ?";
        SQLiteStatement stmt = db.compileStatement(sql);
        stmt.bindString(1, title);
        stmt.bindString(2, content);
        stmt.bindLong(3, id);
        int result = stmt.executeUpdateDelete();
        return result;
    }

    public static long insert(SQLiteDatabase db, String title, String content) {
        String sql = "INSERT INTO memos (title, content, update_at) VALUES (?, ?, datetime('now'))";
        SQLiteStatement stmt = db.compileStatement(sql);
        stmt.bindString(1, title);
        stmt.bindString(2, content);
        long id = stmt.executeInsert();
        return id;
    }

    public static int delete(SQLiteDatabase db, int id) {
        String sql = "DELETE FROM memos WHERE _id = ?";
        SQLiteStatement stmt = db.compileStatement(sql);
        stmt.bindLong(1, id);
        int result = stmt.executeUpdateDelete();
        return result;
    }
}
MVCを採用してDB処理をモデルとして別クラスに記述するとき③データ処理をメソッド化する。
その際それらのメソッドを 「static」 にすることでDAOクラスをnewしなくて良いからメモリの節約になる。

以上。
もし何か間違っている等のご指摘があればご連絡ください。
最後まで読んで頂きありがとうございました。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7