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 < 0){   //処理失敗時の処理を行う。 }
レコードの追加は、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」の使い方 レコード検索編


スポンサーリンク

URL :
TRACKBACK URL :

Comments & Trackbacks

  • Comments ( 2 )
  • Trackbacks ( 2 )
  1. adminさん、こんばんわ。
    上記更新・削除を試し、問題なく更新削除ができました。
    そこで質問なのですが、上記サンプルの場合「String id = “1”;」と指定がされています。
    このIDをListviewで選択した項目のIDに変更して更新削除をしたいのですが、
    そのIDの指定方法が分からずストップしています。
    ちなみに更新はlistviewから内容変更画面に遷り変更後、再度listviewに戻る、
    削除はコンテキストメニューから削除するごくありふれたアプリです。
    内容変更画面にはintent.getIntExtra(“_id”,0);とあるのでこれを適当に「String id = 」の後に入れてみましたが駄目でした。
    実際どのようなIDの指定方法なら変更・削除が可能になるでしょうか?

  2. vol canoさん
    返事遅れてすみません。
    ご質問の内容ですが、要は削除をしたいidの指定方法がわからない、という事でしょうか。
    適当にIDを指定してみたが駄目だった、という事なのですが、どれぐらい適当に指定してみたのでしょうか。本当に適当に「1」とか決め打ち?であればそれは無理でしょう(^^;)
    ListViewに一覧表示する際に、それぞれのレコードのIDは取得していますか?(IDでなくても、そのレコードを一意に判定できる情報であればいいと思います。)
    ListViewの各行に、どのレコードであるか判定できる一意な情報を関連付ける等してあげる必要があるかと思います。

Leave a Reply

*
*
* (公開されません)

CAPTCHA


*

Return Top