[Android]SQLデータベースにデータを保存する | 妄想プログラマのらくがき帳

2013年2月11日月曜日

[Android]SQLデータベースにデータを保存する

データベースにデータを保存するにはSQLiteOpenHelperクラスを使います。

まず最初にSQLiteOpenHelperを継承したクラスを作成します。
public class ClientsDbHelper extends SQLiteOpenHelper {

    /** データベースのバージョン */
    public static final int DB_VERSION = 1;  // データベーススキーマを変更した場合、インクリメントする。

    /** データベースファイル名 */
    public static final String DB_NAME = "clients.db";

    public ClientsDbHelper(Context context) {
        // SQLiteOpenHelperクラスのコンストラクタには
        // データベースのバージョンを渡す。
        // コンストラクタに渡したバージョンと
        // データベースが保持しているバージョンが異なる場合、
        // onUpgrade()、またはonDowngrade()が呼ばれる。

        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // データベースが作成された時に呼び出される。
        // ここでデータベースの初期化(テーブルの作成やテーブルの初期化等)を行う。

        final String createSql = "CREATE TABLE clients("
          + "id INTEGER PRIMARY KEY AUTOINCREMENT, "
          + "name TEXT"
          + ")";
        try {
         db.execSQL(createSql);
        } catch (SQLException e) {
         e.printStackTrace();
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // データベースをアップグレードする必要がある場合に呼び出される。
        // ここでデータベースを新バージョンにアップグレードする処理を行う。
        // 以下は、既存データはすべて破棄しても良い場合の処理例

        db.execSQL("DROP TABLE clients"); // 旧バージョンのテーブルを破棄
        onCreate(db); // 新バージョンでテーブルを作成し直す
    }
}
onDowngrade()の実装は必須ではないので、必要な場合は実装します。

データを挿入する。

データの挿入は、SQLiteDatabase.execSQL()でSQLのINSERT文を実行する方法と
SQLiteDatabase.insert()を使う方法があります。
以下はinsert()を使う場合のコードです。
// ContentValuesに列名と値を設定
ContentValues values = new ContentValues();
values.put("name", "Taro"); 

try {
    // データベースを書き込み用で開く
    ClientsDbHelper dbHelper = new ClientsDbHelper(getApplicationContext());
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    
    db.insert("clients", null, values); // 挿入先テーブルを指定して挿入
    // ↑の場合、valuesが空だとinsert()が例外をスローする。
    // これを防ぐには、次のようにnullColumnHackを指定する。
    // db.insert("clients", "name", values);
} catch (SQLException e) {
    e.printStackTrace();
}
insert()の2つ目の引数nullColumnHackには、ContentValuesが空の場合にNULLを設定する列を指定します。
SQLiteDatabaseはContentValuesが空だとinsert()に失敗(例外スロー)しますが、
nullColumnHackを指定しておくと失敗しないようにできます。

そのため、指定した列はNULLを設定できなければなりません。そうでない場合(intやNOT NULL列の場合)、insert()に失敗します。

通常、ContentValuesが空になることは無いと思うので、nullColumnHackはnullで問題ありません。

データを取得する。

データの取得は、SQLiteDatabase.rawQuery()でSQLのSELECT文を実行する方法と
SQLiteDatabase.query()を使う方法があります。
個人的な好みになりますが、rawQuery()を使った方が分かりやすく簡単だと思います。
以下はrawQuery()を使う場合のコードです。
final String querySql = "SELECT * FROM clients;";

ClientsDbHelper dbHelper = new ClientsDbHelper(getApplicationContext());
Cursor cursor = null;
try {
    // データベースを読み取り専用で開く
    SQLiteDatabase db = dbHelper.getReadableDatabase();
    
    // SELECT文を実行
    cursor = db.rawQuery(querySql, null);

    // Cursorから値を取得するための列indexを取得
    int idColumnIndex = cursor.getColumnIndexOrThrow("id");
    int nameClumnIndex = cursor.getColumnIndexOrThrow("name");
    // Cursorから値を取得
    if (cursor.moveToFirst()) {
        do {
            int id = cursor.getInt(idColumnIndex);
            String name = cursor.getString(nameClumnIndex);

            // do something

        } while (cursor.moveToNext());
    }
} catch (SQLiteException e) {
    e.printStackTrace();
} finally {
    if (cursor != null) {
        cursor.close();
    }
}

データの更新/削除も同様に、SQLiteDatabaseを使って行えます。
SQL文を実行する方法とSQLiteDatabaseのメソッドを使用する方法がありますが、
どちらの方法を使っても大差ないので、使い勝手の良い方を使うのがいいと思います。

0 件のコメント:

コメントを投稿