mucchinのAndroid戦記

Androidアプリのデータ保存方法の一つ「SQLite」の使い方 行の追加・更新・削除編

Androidのデータベース「SQLite」の使い方は?

今回は、「Androidアプリのデータ保存方法の一つ「SQLite」の使い方 SQLiteOpenHelper編」の続編です。
上記の記事では、AndroidアプリからのSQLiteデータベースのオープン処理を紹介しました。
データベースのオープン後は、データを保存したり取得したりと、いよいよ目的の動作を行います。
今回は、レコードの追加、更新、削除について紹介します。
長くなりますので、検索は別記事にします。(以下です。)
Androidアプリのデータ保存方法の一つ「SQLite」の使い方 レコード検索編

レコードの追加、更新、削除と、検索の違いは、戻り値です。
検索は、検索結果が格納されたオブジェクトが戻りますが、レコードの追加、更新、削除は、成功か失敗かの結果を示すフラグや数値が戻り値となります。


これから示すサンプルコードでは、「Androidアプリのデータ保存方法の一つ「SQLite」の使い方 SQLiteOpenHelper編」で掲載しているサンプルコードにて、既にSQLiteDatabase型インスタンスを生成しているものとします。
変数名は、sdbとします。

レコードの追加方法

それではまず、レコード追加時のサンプルコードを見てみましょう。
なお、テーブル定義は、テーブル名は「bookmarklist」で、_id列とbookmark列の2列が存在する事とします。
※_id列については、別記事「Androidアプリで使用するSQLiteのテーブル作成時の注意点」を参照してください。


ContentValues values = new ContentValues();
values.put(“bookmark”, “https://android.roof-balcony.com”);
long id = sdb.insert(“bookmarklist”, null, values);
if (id レコードの追加は、SQLiteDatabase.insert()メソッドを使います。
第一引数はテーブル名です。
第二引数はちょっと飛ばして、第三引数は挿入するレコードの内容を格納したContentValues型インスタンスを渡します。
列名をキーとして、値をput()メソッドで渡します。
今回は一つですが、必要なカラム数分だけput()メソッドを実行しましょう。

第二引数は、APIリファレンスの英文をよくみましたが不明です・・。
「SQL doesn’t allow inserting a completely empty row, so if initialValues is empty this column will explicitly be assigned a NULL value」
SQLでは、完全に空である行を挿入できないため、初期値が空であるならば、このカラムはNULL値が割り当てられるでしょう。という訳でいいんですかね・・・。
だとして、この引数の役割は何なのか・・?
保険的な引数なのかもしれませんが、テーブル仕様どおりにContentValues型インスタンスをしっかり作っておけば、いいんじゃないでしょうか。

insert()メソッドの戻り値は、_idに設定された数値となります。
-1が返却された場合は、エラーを示します。
エラー時は、警告を出すなど、エラーに必要な処理を行って下さい。

レコードの更新方法

次は、レコード更新時のサンプルコードを見てみましょう。


String id = “1”;
ContentValues values = new ContentValues();
values.put(“bookmark”, “http://freegame.roof-balcony.com”);
sdb.update(“bookmarklist”, values, “_id=?”, new String[]{id});
レコードの更新は、SQLiteDatabase.update()メソッドを使います。
第一引数は、レコードの更新を行うテーブル名を指定します。
第二引数は、レコード追加時と同じく、ContentValues型インスタンスを設定します。
詳しくは先ほどのレコード追加時の説明を見てください。
第三引数は、SQLのwhere句、つまり更新するレコードの条件にするカラムを指定します。
サンプルコードのように、「?」を付ける事で、この後で指定する第四引数の配列にあたる条件が代入されてSQLが生成されます。
これらの処理をSQLで表現すると、以下のようになります。
update bookmarklist
set bookmark = “http://freegame.roof-balcony.com”
where _id = 1
update()メソッドの戻り値は、実際更新されたレコード数が返却されます。
今回のSQLならば、条件が「_id = 1」のレコードですので、1以外ならばエラーとする、等が考えられますが、更新する条件のレコードが無い場合もありますので、エラー処理を実装する場合はよく確かめて実装してください。
実際、本当にエラーだった場合はどうなるんだろうか、APIリファレンスを見ても書いてませんでした・・・。

レコードの削除方法

次は、レコードの削除のサンプルコードについてみてみましょう。


String id = “1”;
sdb.delete(“bookmarklist”, “_id = ?”, new String[]{id});
レコードの更新は、SQLiteDatabase.delete()メソッドを使います。
第一引数は、レコードの更新を行うテーブル名を指定します。
第二引数、第三引数は、先ほどの更新(update)と同じく、条件を指定します。
delete()の戻り値は、削除されたレコード数が戻ります。
これもupdate()同様、APIリファレンスには、エラー時の動作については書かれていませんでした・・・。

なお、上記の処理をSQL文にすると、以下のようになります。


delete from bookmarklist where _id = 1
スポンサーリンク




SQL文をそのまま実行する方法

これまでのように、レコードの追加はinsert()、更新はupdate()、削除はdelete()の各メソッドを使用する方法もありますが、SQLiteDatabaseクラスには、SQL文をそのまま実行してくれるメソッドもあります。
それが、SQLiteDatabase.execSQL()です。

SQLが得意な方は、このexecSQL()の方が使いやすいと思います。
例えば、先ほどの例のレコード更新の場合だと、以下のようなコードになります。


String sqlstr = “update bookmarklist ” +
        ”set bookmark = ‘http://freegame.roof-balcony.com’ ” +
        ”where _id = 1″
sdb.execSQL(sqlstr);
これなら、SQL文さえ理解しておけば、全てexecSQL()で実装できます。
更新や削除の際、複雑な条件文を指定するのであれば、SQL文の状態で処理を行った方が簡単ではないかなと私は思います。
注意事項ですが、このexecSQL()は、select文は使えません。
レコードの追加、更新、削除や、テーブルの作成、削除にはこのexecSQL()が使えます。
次回の記事で説明しますが、select文の場合は、rowQuery()やquery()メソッドしか使えません。

なお、このexecSQL()は戻り値なしです。
例えばSQL構文を間違っているなどのエラー時は、SQLExceptionがスローされます。

次回は、レコードの検索、selectの処理を説明します。
Androidアプリのデータ保存方法の一つ「SQLite」の使い方 レコード検索編