Sqlite使い方

目次へ

Sqliteとは

軽量なオープンソースのRDBMSであり、Linux、Mac、Windows、Android、iOSなどに対応していますが、 Androidの場合、すべてのAndroid端末にSQLiteが搭載されているため、インストールなしで使えます。

データ型としては、TEXT,NUMERIC,INTEGER,REAL,NONE(指定なし)などが使えますが、 たとえば、INTEGER型のカラムに文字列を入れようとすると、数値に変換しようと試み、 だめなら文字列で格納してしまいます。
データ型の指定を強制しないため、データ型を指定せずにテーブルを作ることも可能です。

また、中規模程度までのデータベースであれば、その他のデータベースと遜色がない処理性能を発揮すると言われているようです。

AndroidからSqliteを使う

Android 上でデータベースを利用する際に主に使用するAPIには以下のようなものがあります。
クラス 機能 パッケージ
SQLiteOpenHelper DBの作成とアップグレードのためのメソッドを持つ。
これを継承したクラスを作成し、表の作成、アップグレード時の処理などを記述
android.database.sqlite
SQLiteDatabase DB操作の各種メソッドを提供する
たとえば
query(),delete(),update(),insert(),beginTransaction(),endTransactin()等
SQLを渡すメソッドもある
rawQuery(),execSQL()等
android.database.sqlite
ContentValues updateやinsertなどのメソッドにデータを渡すためのクラスで、
key(列名)=value(値)の形式で値を格納
android.content
Cursor
(インターフェース)
検索結果のレコードセットを持ち、レコードを取得したりすることができる android.database

手順

  • SQLiteOpenHelperを継承したクラスを作成します。
    • コンストラクタでDB名、バージョンを指定
      DBが存在しない場合のみDBが作成されます
    • onCreate()をオーバーライドし表を作成します。
      このメソッドはDBが存在しない場合のみ呼ばれるため、ここでCREATE TABLEを行うのが一般的のようです。
    • onUpgrade()をオーバーライドし、バージョンが変更された時必要な処理を書きます。
      このメソッドはバージョンが変更された時のみ呼ばれます。
  • DBを操作するクラスを作り、その中で、
    • SQLiteOpenHelperのインスタンスを作成します。
      SQLiteOpenHelper helper = new MyOpenHelper(context);
    • SQLiteDatabaseを取得します。
      SQLiteDatabase db = helper.getWritableDatabase();
    • あとは、このdbを使ってDBを操作します。

MyOpenHelperクラスの例

たとえば、書籍データを保存するようなDBを作る例ですがここでやっているのは次のようなことです。
  • SQLiteOpenHelperを継承したクラスを作ります。
  • コンストラクタで、DB名とバージョンを指定して親のコンストラクタを呼び出します。
  • onCreateをオーバーライドし、表を作成するSQLを実行します。
  • onUpgradeをオーバーライドし、バージョンが変わった時、BOOK表を削除し、再度作り直す処理を書いています。

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MyOpenHelper extends SQLiteOpenHelper{
    public static final int DB_VERSION = 1;     //これが変わるとonUpgradeが呼び出される

    //-----------------------------------------------------------------------コンストラクタ
    public MyOpenHelper(Context context) {
        super(context, "MYDB", null, DB_VERSION);
    }
    //-----------------------------------------------------------------------onCreate
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(
            "CREATE TABLE BOOK ( " +
                " ID INTEGER PRIMARY KEY AUTOINCREMENT, " + //主キー
                " ISBN        TEXT, " +                     //ISBN
                " TITLE       TEXT, " +                     //書名
                " AUTHOR    TEXT, " +                     //著者
                " PRICE       INTEGER, " +                  //価格
                " MEMO      TEXT) "                       //メモ
        );
    }
    //-----------------------------------------------------------------------onUpgrade
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS BOOK");
        onCreate(db);
    }
}

DBを操作するクラスの例

このクラスではDBにアクセスするメソッドをまとめておき、必要な時に呼び出せるようにしています。
ここでは、次のようなメソッドを作っています
メソッド 機能
MyDAO(Context context) コンストラクタ
void insertTitle(String name) 書名を指定してレコードを挿入、IDは自動で付与
void insert(ContentValues values) ID以外すべてのデータを指定してレコードを挿入
void deleteAll() 全てのレコードを削除
void deleteBooksById(int id) 指定されたIDのレコードを削除
void update(int id, ContentValues values) 指定したIDのレコードを更新
ArrayList<Map<String, Object>> selectAllBooks() 全てのレコードをセレクトし、ArrayListで返す
ArrayList<Map<String, Object>> selectByTitle(String partOfTitle) 書名の一部を指定してその条件に合ったレコードをセレクト
Map<String, Object> selectById(int id) IDを指定してレコードをセレクト

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class MyDAO{
    MyOpenHelper helper;
    SQLiteDatabase db;
    ArrayList<Map<String, Object>> listForSelect;
    //-----------------------------------------------------------------------コンストラクタ
    public MyDAO(Context context) {
        helper = new MyOpenHelper(context);
        db = helper.getWritableDatabase();      //読み書き可
        listForSelect = new ArrayList<>();
    }
    //------------------------------------------------------------------- INSERT execSQL使用
    public void insertTitle(String name) {
        //SQL文を作って挿入することもできるが、戻り値で挿入できたか確かめることができない
        String sql = "INSERT INTO BOOK (NAME) VALUES('" + name + "')";
        db.execSQL(sql);
    }
    //--------------------------------------------------------------------- INSERT insertメソッド使用
    //valuesの中にはISBN=xxx、title=xxx、author=xxx、price=1000…などのデータが入っている
    public void insert(ContentValues values) {
        //第2引数は第3引数が何も入っていない時 insert into table (第2引数) values (null)のSQLを実行
        //戻り値-1は エラー
        long rowId = db.insert(“BOOK”, null, values);
    }
    //------------------------------------------------------------------- DELETE execSQL使用
    public void deleteAll() {
        db.execSQL("DELETE FROM BOOK”);
    }
    //------------------------------------------------------------------- DELETE deleteメソッド使用
    public void deleteBooksById(int id) {
        String[] ids = {Integer.toString(id)};
        int num = db.delete(“BOOK”, "ID=?", ids);	//コンパイル済みSQLに?の部分だけデータ入れる
    }
    //------------------------------------------------------------------- UPDATE
    public void update(int id, ContentValues values) {
        String[] ids = {Integer.toString(id)};
        int num = db.update(“BOOK”, values, "ID=?", ids);
    }
    //-----------------------------------------------------------------------すべてのBOOKデータ取得
    public ArrayList<Map<String, Object>> selectAllBooks() {
        Cursor cursor = db.query(
                “BOOK”,      // table name
                null,       // The array of columns to return (pass null to get all)
                null,       // The columns for the WHERE clause
                null,       // The values for the WHERE ?clause
                null,       // group by句
                null,       // having by句
                "ID ASC"    // The sort order
        );
        cursor.moveToFirst();
        int count = cursor.getCount();
        listForSelect.clear();	//使いまわしているため
        for (int i = 0; i < count; i++) {
            Map<String, Object> map = new HashMap<String, Object>();
            int id = cursor.getInt(0);
            map.put("id", id);
            String isbn = cursor.getString(1);
            map.put("isbn", isbn);
            String title = cursor.getString(2);
            map.put("title", title);
            String author = cursor.getString(3);
            map.put("author", author);
            int price = cursor.getInt(4);
            map.put("price", price);
            String memo = cursor.getString(5);
            map.put("memo", memo);

            listForSelect.add(map);
            cursor.moveToNext();
        }
        cursor.close(); // 忘れずに!
        return listForSelect;
    }
    //-----------------------------------------------------------------------指定されたtitleのデータ取得
    public ArrayList<Map<String, Object>> selectByTitle(String partOfTitle) {
        String where = "TITLE LIKE '%%" + partOfTitle + "%%'";
        Cursor cursor = db.query(
                “BOOK”,
                null,   // The array of columns to return (pass null to get all)
                where,     // WHERE clause
                null,      // The values for the WHERE ?clause
                null,      // don't group the rows
                null,      // don't filter by row groups
                null       // The sort order
        );
        cursor.moveToFirst();
        int count = cursor.getCount();
        listForSelect.clear();
        for (int i = 0; i < count; i++) {
            Map<String, Object> map = new HashMap<String, Object>();
            int id = cursor.getInt(0);
            map.put("id", id);
            String isbn = cursor.getString(1);
            map.put("isbn", isbn);
            String title = cursor.getString(2);
            map.put("title", title);
            String author = cursor.getString(3);
            map.put("author", author);
            int price = cursor.getInt(4);
            map.put("price", price);
            String memo = cursor.getString(5);
            map.put("memo", memo);
            listForSelect.add(map);
            cursor.moveToNext();
        }
        cursor.close(); // 忘れずに!
        return listForSelect;
    }
    //-----------------------------------------------------------------------指定されたidのデータ取得
    public Map<String, Object> selectById(int id) {
        String where = "ID=?";
        String[] hatenas = {String.valueOf(id)};
        Cursor cursor = db.query(
                “BOOK”,
                null,   // The array of columns to return (pass null to get all)
                where,     // WHERE clause
                hatenas,      // The values for the WHERE ?clause
                null,      // don't group the rows
                null,      // don't filter by row groups
                null       // The sort order
        );
        int count = cursor.getCount();
        if(count != 1) {
            return null;
        } else {
            cursor.moveToFirst();
            Map<String,Object> map = new HashMap<>();
            int id1 = cursor.getInt(0);
            map.put("id", id1);
            String isbn = cursor.getString(1);
            map.put("isbn", isbn);
            String title = cursor.getString(2);
            map.put("title", title);
            String author = cursor.getString(3);
            map.put("author", author);
            int price = cursor.getInt(4);
            map.put("price", price);
            String memo = cursor.getString(5);
            map.put("memo", memo);
            return map;
        }
    }
}

アプリの画面

Activityでは、DBを操作するクラスのインスタンスを作成し、その中の必要なメソッドを呼び出して、 データを取得したり、入力されたデータを使って新規にレコードを挿入したり、削除したりなどを行います。 別の操作をしたければ、上で作成したMyDAOクラスにそのような処理を行うメソッドを追加すればよいことになります。

コメント

このブログの人気の投稿

ListViewの使い方

AsyncTaskについて

ListViewとSimpleAdapter使い方