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名、バージョンを指定
-
DBを操作するクラスを作り、その中で、
-
SQLiteOpenHelperのインスタンスを作成します。
SQLiteOpenHelper helper = new MyOpenHelper(context); -
SQLiteDatabaseを取得します。
SQLiteDatabase db = helper.getWritableDatabase(); - あとは、このdbを使ってDBを操作します。
-
SQLiteOpenHelperのインスタンスを作成します。
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;
}
}
}
コメント
コメントを投稿