[Android] SQLiteを使用してデータを保存する

今回は Android で SQLite を使用してデータを保存する方法を見てみます。

SQLite は、リレーショナル型データベースの一種ですが、MySQL や PostgreSQL のようなサーバ/クライアント方式ではなく、アプリケーション内に組み込んで使用するタイプの軽量データベースです。 大規模なデータの管理には不向きですが、組み込み機器内でのデータ管理にはよく使われているようです。

Android アプリ内で作成した SQLite データベースは、同一アプリ内のどのクラスからもアクセス可能ですが、他のアプリからはアクセスできません。

準備

SQLite を利用するためには、データベースの作成とバージョン管理を担当するヘルパークラスである SQLiteOpenHelper のサブクラスを作成しておきます。

その際、SQLiteOpenHelper で定義されている抽象メソッド onCreate() と onUpgrade() を実装する必要があります。

例えば、MyDBHelper という名前のクラスを以下のように作成します。

public class MyDBHelper extends SQLiteOpenHelper {

  private final static String DB_NAME = "test.db";
  private final static int VERSION = 1;

  public MyDBHelper(Context context) {
    super(context, DB_NAME, null, VERSION);
  }

  @Override
  public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE goods ("
            + "id INTEGER PRIMARY KEY AUTOINCREMENT,"
            + "name STRING,"
            + "price INTEGER)");
  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVer, int newVer) {
    // データーベース構造の変換(省略)
  }

}

このコードでは、「test.db」というデータベースに「goods」というテーブルを作成しています。

データの保存

データを保存する場合は、上記で準備したヘルパークラスのインスタンスから getWritableDatabase() メソッドでデータベースのインスタンスを取得し、insert() メソッドでデータを挿入します。

例えば、goods テーブルに60円の鉛筆のデータを追加する場合は以下のように記述します。

SQLiteDatabase db = helper.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("name", "鉛筆");
cv.put("price", 60);
db.insert("goods", null, cv);

追加するデータのカラム値を設定する際には、上記のように ContentValues オブジェクトを使用します。

データの読み出し

データを読み出す場合は、ヘルパークラスのインスタンスから getReadableDatabase() メソッドでデータベースのインスタンスを取得し、query() メソッドでデータを取得します。

SQLiteDatabase#query() メソッドの戻り値は Cursor オブジェクトで、Cursor#getString(int columnIndex) や Cursor#getInt(int columnIndex) メソッドなどを使用して特定のカラムのデータを取得します。

SQLiteDatabase db = helper.getReadableDatabase();
Cursor cs = db.query("greetings", null, null, null, null, null, null);
if (cs.moveToFirst()) {
  do {
    String name = cs.getString(1);
    int price = cs.getInt(2);
    Log.d("TEST", message);
  } while (cs.moveToNext());
}

Cursor#moveToFirst() は、カーソルを先頭に移動するメソッドで、先頭のデータが無い場合(つまり何もデータが無い場合)は false を返します。 Cursor#moveToNext() はカーソルを次の行に移動するメソッドで、次のデータが無い場合は false を返します。

参考

公式サイトのデータ保存の説明ページ: Storage Options | Android Developers

公式サイトの SQLiteOpenHelper の説明ページ:SQLiteOpenHelper | Android Developers

公式サイトの SQLiteDatabase の説明ページ:SQLiteDatabase | Android Developers

公式サイトの ContentValues の説明ページ:ContentValues | Android Developers

公式サイトの Cursor の説明ページ: Cursor | Android Developers


Pocket
Bookmark this on Yahoo Bookmark

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>