読者です 読者をやめる 読者になる 読者になる

Androidアプリ開発メモ

コピペ開発を目指す非プログラマのmemo

Androidでデータベースを使う

データベース

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」という一つ目のカラム。

AndroidSQLite関係のクラスでは、この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();

使い終わったものはちゃんと閉める。


★たまにアプリ公開してるので宜しければ覗いてみてください。

以上