DBの作成
テーブルの作成
個別にインサート
検索して表示
を確認用に初歩的な処理だけ。
MySqLiteOpenHelper.java
package com.example.androidtestproject; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class MySQLiteOpenHelper extends SQLiteOpenHelper { /** アクセスするデータベース名 */ private static final String DB_NAME = "example.db"; /** DBのバージョン */ private static final int DB_VERSION = 1; /** create table文 */ private static final String createTableString = "create table personal_data(_id integer primary key autoincrement, name text,age integer, delete_flg integer)"; public MySQLiteOpenHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(createTableString); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO 自動生成されたメソッド・スタブ } }
MainActivity.java
package com.example.androidtestproject; import java.util.ArrayList; import java.util.List; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; import android.widget.LinearLayout; import android.widget.TextView; public class MainActivity extends ActionBarActivity { /** データベース */ private SQLiteDatabase db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LinearLayout llayout = (LinearLayout) findViewById(R.id.llayout); // インスタンス作成 MySQLiteOpenHelper helper = new MySQLiteOpenHelper(this); // 読み書き出来るように開く db = helper.getWritableDatabase(); // レコード1設定 ContentValues values = new ContentValues(); values.put("name", "田中一郎"); values.put("age", 50); values.put("delete_flg", 0); // レコード1追加 db.insert("personal_data", null, values); // レコード2設定 ContentValues values2 = new ContentValues(); values2.put("name", "山田花子"); values2.put("age", 70); values2.put("delete_flg", 0); // レコード2追加 db.insert("personal_data", null, values2); // レコード3設定 ContentValues values3 = new ContentValues(); values3.put("name", "佐藤裕也"); values3.put("age", 20); values3.put("delete_flg", 1); // レコード3追加 db.insert("personal_data", null, values3); // レコードを検索してカーソルを作成 Cursor cursor = db.query("personal_data", new String[] { "_id", "name", "age" }, "delete_flg = ?", new String[] { "0" }, null, null, "age ASC"); List<String> record = new ArrayList<String>(); // カーソルから値を取り出す while (cursor.moveToNext()) { String str = cursor.getString(cursor.getColumnIndex("_id")) + "\t" + cursor.getString(cursor.getColumnIndex("name")) + "\t" + cursor.getString(cursor.getColumnIndex("age")); record.add(str); } // テキストビューで表示 for (int i = 0; i < record.size(); i++) { TextView tv = new TextView(this); tv.setText(record.get(i)); llayout.addView(tv); } // カーソルクローズ cursor.close(); // DBクローズ db.close(); // MySQLiteOpenHelperクローズ helper.close(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
解説
MySqLiteOpenHelper.java
データベースを開く為に使う。
public MySQLiteOpenHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); }
コンストラクタで作成するDBの名前とバージョンをスーパークラスに渡し、DBをオープンする。
@Override public void onCreate(SQLiteDatabase db) { db.execSQL(createTableString); }
onCreateはDBが存在しない場合に実行されるので、ここでテーブルを作成している。
作成しているcreate table文
create table personal_data(
_id integer primary key autoincrement
, name text,age integer
, delete_flg integer)
気をつけたいのが「_id」という一つ目のカラム。
AndroidのSQLite関係のクラスでは、このIDを示す「_id」カラムがあるという前提で実装されているクラスがあります。
例えば、CursorAdapter等です。
引用:Androidアプリで使用するSQLiteのテーブル作成時の注意点 | mucchinのAndroid戦記
ということなので注意。
MainActivity.java
// 読み書き出来るように開く
db = helper.getWritableDatabase();
helper.getReadableDatabase();にすれば読み込み専用で開くこともできる。
// レコード1設定 ContentValues values = new ContentValues(); values.put("name", "田中一郎"); values.put("age", 50); values.put("delete_flg", 0); // レコード1追加 db.insert("personal_data", null, values);
テーブルに合わせたレコードを作成し、DBにインサート。
// レコードを検索してカーソルを作成 Cursor cursor = db.query("personal_data", new String[] { "_id", "name", "age" }, "delete_flg = ?", new String[] { "0" }, null, null, "age ASC");
クエリの発行。 検索結果はCursorからアクセスする。
今回使用したメソッドは以下
query(
String table
, String[] columns
, String selection
, String[] selectionArgs
, String groupBy
, String having
, String orderBy)
String columnsはSELECT句
表示したいカラムを指定する。
String selectionはWHERE句
検索条件を指定する。その際、条件となる値は
String selectionArgsで指定する。
今回はdelete_flgを見て、論理削除されていない「0」のレコードを取り出す条件。
String groupByとString havingは指定無し。
String orderByはageを昇順で指定。
// カーソルから値を取り出す while (cursor.moveToNext()) { String str = cursor.getString(cursor.getColumnIndex("_id")) + "\t" + cursor.getString(cursor.getColumnIndex("name")) + "\t" + cursor.getString(cursor.getColumnIndex("age")); record.add(str); }
cursor.moveToNext()でレコードを進めながらリストにレコードの情報を追加。
getColumnIndex(String columnName)でカラムの位置を取り出し、getString(int columnIndex)で値を取り出す。
// カーソルクローズ cursor.close(); // DBクローズ db.close(); // MySQLiteOpenHelperクローズ helper.close();
使い終わったものはちゃんと閉める。
★たまにアプリ公開してるので宜しければ覗いてみてください。