/* DataManager.java Copyright (c) 2016 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.app.simplebot.data; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import org.deviceconnect.android.app.simplebot.BuildConfig; /** * データ管理クラス */ public class DataManager { /** デバッグタグ */ private static final String TAG = "DataManager"; /** DBのバージョン */ private static final int DB_VERSION = 4; /** DBファイル名 */ public static final String DB_NAME = "simplebot.db"; /** テーブル名 */ public static final String TABLE_NAME = "command"; /** idのカラム名 */ public static final String COLUMN_ID = "_id"; /** keywordのカラム名 */ public static final String COLUMN_KEYWORD = "keyword"; /** serviceIdのカラム名 */ public static final String COLUMN_SERVICE_ID = "serviceId"; /** serviceNameのカラム名 */ public static final String COLUMN_SERVICE_NAME = "serviceName"; /** apiのカラム名 */ public static final String COLUMN_API = "api"; /** methodのカラム名 */ public static final String COLUMN_METHOD = "method"; /** pathのカラム名 */ public static final String COLUMN_PATH = "path"; /** bodyのカラム名 */ public static final String COLUMN_BODY = "body"; /** acceptのカラム名 */ public static final String COLUMN_ACCEPT = "accept"; /** accept_uriのカラム名 */ public static final String COLUMN_ACCEPT_URI = "accept_uri"; /** successのカラム名 */ public static final String COLUMN_SUCCESS = "success"; /** success_uriのカラム名 */ public static final String COLUMN_SUCCESS_URI = "success_uri"; /** errorのカラム名 */ public static final String COLUMN_ERROR = "error"; /** error_uriのカラム名 */ public static final String COLUMN_ERROR_URI = "error_uri"; /** 全カラム */ public static final String[] COLUMNS = { COLUMN_ID, COLUMN_KEYWORD, // キーワード COLUMN_SERVICE_ID, // サービスID COLUMN_SERVICE_NAME, // サービス名 COLUMN_API, // API COLUMN_METHOD, // メソッド COLUMN_PATH, // パス COLUMN_BODY, // ボディ COLUMN_ACCEPT, // 受付レスポンス COLUMN_ACCEPT_URI, // 受付レスポンスリソースURI COLUMN_SUCCESS, // 成功レスポンス COLUMN_SUCCESS_URI, // 成功レスポンスリソースURI COLUMN_ERROR, // 失敗レスポンス COLUMN_ERROR_URI // 失敗レスポンスリソースURI }; /** SQLiteHelper */ private SQLiteHelper sql; /** * データクラス */ public static class Data { public long id = -1; public String keyword; public String serviceId; public String serviceName; public String api; public String method; public String path; public String body; public String accept; public String acceptUri; public String success; public String successUri; public String error; public String errorUri; @Override public String toString() { return "Data{" + "id=" + id + ", keyword='" + keyword + '\'' + ", serviceId='" + serviceId + '\'' + ", serviceName='" + serviceName + '\'' + ", api='" + api + '\'' + ", method='" + method + '\'' + ", path='" + path + '\'' + ", body='" + body + '\'' + ", accept='" + accept + '\'' + ", acceptUri='" + acceptUri + '\'' + ", success='" + success + '\'' + ", successUri='" + successUri + '\'' + ", error='" + error + '\'' + ", errorUri='" + errorUri + '\'' + '}'; } } /** * SQLHelper */ private class SQLiteHelper extends SQLiteOpenHelper { /** * context指定で初期化 * @param context コンテキスト */ public SQLiteHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { StringBuilder sb = new StringBuilder(); sb.append("create table "); sb.append(TABLE_NAME); sb.append(" ("); sb.append(COLUMN_ID); sb.append(" integer PRIMARY KEY AUTOINCREMENT"); for (String col: COLUMNS) { if (col.equals(COLUMN_ID)) { continue; } else { sb.append(", "); } sb.append(col); sb.append(" text"); } sb.append(");"); if (BuildConfig.DEBUG) Log.d(TAG,"onCreate:" + sb.toString()); db.execSQL(sb.toString()); addSampleData(db); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db); } } /** * context指定で初期化 * @param context コンテキスト */ public DataManager(Context context) { sql = new SQLiteHelper(context); } /** * データを登録 * @param db DB * @param data データ * @return trueで成功 */ public boolean upsert(SQLiteDatabase db, Data data) { if (BuildConfig.DEBUG) Log.d(TAG,"upsert:" + data.toString()); ContentValues values = new ContentValues(); values.put(COLUMN_KEYWORD, data.keyword); values.put(COLUMN_SERVICE_ID, data.serviceId); values.put(COLUMN_SERVICE_NAME, data.serviceName); values.put(COLUMN_API, data.api); values.put(COLUMN_METHOD, data.method); values.put(COLUMN_PATH, data.path); values.put(COLUMN_BODY, data.body); values.put(COLUMN_ACCEPT, data.accept); values.put(COLUMN_ACCEPT_URI, data.acceptUri); values.put(COLUMN_SUCCESS, data.success); values.put(COLUMN_SUCCESS_URI, data.successUri); values.put(COLUMN_ERROR, data.error); values.put(COLUMN_ERROR_URI, data.errorUri); long ret; if (data.id < 0) { ret = db.insert(TABLE_NAME, null, values); } else { ret = db.update(TABLE_NAME, values, COLUMN_ID + "=?", new String[]{String.valueOf(data.id)}); } return ret > 0; } /** * データを登録 * @param data データ * @return trueで成功 */ public boolean upsert(Data data) { SQLiteDatabase db = sql.getWritableDatabase(); return upsert(db, data); } /** * データを削除 * @param id ID * @return trueで成功 */ public boolean delete(long id) { if (BuildConfig.DEBUG) Log.d(TAG,"upsert:" + String.valueOf(id)); SQLiteDatabase db = sql.getWritableDatabase(); long ret = db.delete(TABLE_NAME, COLUMN_ID + "=?", new String[]{String.valueOf(id)}); return ret > 0; } /** * 全てのデータを返すカーソル取得 * @return カーソル */ public Cursor getAll() { if (BuildConfig.DEBUG) Log.d(TAG,"getAll"); SQLiteDatabase db = sql.getReadableDatabase(); return db.query(TABLE_NAME, COLUMNS, null, null, null, null, COLUMN_ID + " desc"); } /** * ID指定でデータを取得 * @param id ID * @return データ */ public Data getData(long id) { if (BuildConfig.DEBUG) Log.d(TAG,"getData:" + id); SQLiteDatabase db = sql.getReadableDatabase(); Cursor cursor = db.query(TABLE_NAME, COLUMNS, COLUMN_ID + "=?", new String[]{String.valueOf(id)}, null, null, COLUMN_ID + " desc"); if (cursor.moveToFirst()) { Data data = convertData(cursor); cursor.close(); return data; } else { cursor.close(); return null; } } /** * SQLiteのカーソルから情報を取得 * @param cursor カーソル * @return データ */ public Data convertData(Cursor cursor) { Data data = new Data(); data.id = cursor.getLong(cursor.getColumnIndex(COLUMN_ID)); data.keyword = cursor.getString(cursor.getColumnIndex(COLUMN_KEYWORD)); data.serviceId = cursor.getString(cursor.getColumnIndex(COLUMN_SERVICE_ID)); data.serviceName = cursor.getString(cursor.getColumnIndex(COLUMN_SERVICE_NAME)); data.api = cursor.getString(cursor.getColumnIndex(COLUMN_API)); data.method = cursor.getString(cursor.getColumnIndex(COLUMN_METHOD)); data.path = cursor.getString(cursor.getColumnIndex(COLUMN_PATH)); data.body = cursor.getString(cursor.getColumnIndex(COLUMN_BODY)); data.accept = cursor.getString(cursor.getColumnIndex(COLUMN_ACCEPT)); data.acceptUri = cursor.getString(cursor.getColumnIndex(COLUMN_ACCEPT_URI)); data.success = cursor.getString(cursor.getColumnIndex(COLUMN_SUCCESS)); data.successUri = cursor.getString(cursor.getColumnIndex(COLUMN_SUCCESS_URI)); data.error = cursor.getString(cursor.getColumnIndex(COLUMN_ERROR)); data.errorUri = cursor.getString(cursor.getColumnIndex(COLUMN_ERROR_URI)); return data; } /** * CSVのデータから情報を取得 * @param csv 文字列 * @return データ */ public Data convertData(String[] csv) { if (csv == null || csv.length != 13) { return null; } Data data = new Data(); int index = 0; data.keyword = csv[index++]; data.serviceId = csv[index++]; data.serviceName = csv[index++]; data.api = csv[index++]; data.method = csv[index++]; data.path = csv[index++]; data.body = csv[index++]; data.accept = csv[index++]; data.acceptUri = csv[index++]; data.success = csv[index++]; data.successUri = csv[index++]; data.error = csv[index++]; data.errorUri = csv[index]; return data; } /** * サンプルデータを追加 */ private void addSampleData(SQLiteDatabase db) { // 音楽リスト Data data = new Data(); data.keyword = "音楽(リスト|一覧)"; data.path = "/gotapi/mediaPlayer/mediaList"; data.api = "mediaPlayer/mediaList [GET]"; data.method = "GET"; data.body = null; data.success = "{%loop in $media as $m}[{$m.mediaId}:{$m.title}]{% endloop %}"; data.error = "エラーです。 {$errorMessage}"; data.serviceId = "Host.ebc9a9ec2354491f929dd4b25abccb6.localhost.deviceconnect.org"; data.serviceName = "Host"; upsert(db, data); // 音楽設定 data.keyword = "(\\d+)を設定"; data.path = "/gotapi/mediaPlayer/media"; data.api = "mediaPlayer/media [PUT]"; data.method = "PUT"; data.body = "{\"mediaId\":\"$1\"}"; data.success = "設定しました。"; upsert(db, data); // 再生 data.keyword = "再生"; data.path = "/gotapi/mediaPlayer/play"; data.api = "mediaPlayer/play [PUT]"; data.method = "PUT"; data.body = null; data.success = "再生しました。"; upsert(db, data); // 停止 data.keyword = "停止"; data.path = "/gotapi/mediaPlayer/stop"; data.api = "mediaPlayer/stop [PUT]"; data.method = "PUT"; data.success = "停止しました。"; upsert(db, data); // バッテリー残量 data.keyword = "バッテリー|電池"; data.path = "/gotapi/battery/level"; data.api = "battery/level [GET]"; data.method = "GET"; data.success = "残り{$level|calc(*100)}%です。"; upsert(db, data); // 写真 data.keyword = "写真"; data.path = "/gotapi/mediaStreamRecording/takePhoto"; data.api = "mediaStreamRecording/takePhoto [POST]"; data.method = "POST"; data.accept = "撮影します、しばらくお待ちください。"; data.success = "撮影しました。"; data.successUri = "{$uri}"; upsert(db, data); } }