データベースにデータを保存するには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のメソッドを使用する方法がありますが、
どちらの方法を使っても大差ないので、使い勝手の良い方を使うのがいいと思います。