/*
HueDBHelper
Copyright (c) 2017 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.hue;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.BaseColumns;
import com.philips.lighting.hue.sdk.PHAccessPoint;
import java.util.ArrayList;
import java.util.List;
/**
* Hueアクセスポイント情報を格納するDBヘルパークラス.
* @author NTT DOCOMO, INC.
*/
class HueDBHelper {
/**
* Define the name of the database.
*/
private static final String DB_NAME = "hue_bridge.db";
/**
* Define the version of the database.
*/
private static final int DB_VERSION = 1;
/**
* アクセスポイントの情報を格納するテーブル名.
*/
private static final String TBL_NAME = "access_point_tbl";
/**
* ユーザ名を格納するカラム名.
*/
private static final String COL_USER_NAME = "user_name";
/**
* IPアドレスを格納するカラム名.
*/
private static final String COL_IP_ADDRESS = "ip_address";
/**
* Macアドレスを格納するカラム.
*/
private static final String COL_MAC_ADDRESS = "mac_address";
/**
* DB管理ヘルパー.
*/
private DBHelper mDBHelper;
HueDBHelper(final Context context) {
mDBHelper = new DBHelper(context);
}
/**
* アクセスポイントを追加します.
* @param accessPoint 追加するアクセスポイント
* @return 追加した行番号
*/
synchronized long addAccessPoint(final PHAccessPoint accessPoint) {
ContentValues values = new ContentValues();
values.put(COL_USER_NAME, accessPoint.getUsername());
values.put(COL_IP_ADDRESS, accessPoint.getIpAddress());
values.put(COL_MAC_ADDRESS, accessPoint.getMacAddress());
SQLiteDatabase db = mDBHelper.getWritableDatabase();
try {
return db.insert(TBL_NAME, null, values);
} finally {
db.close();
}
}
/**
* 指定されたIPアドレスと同じアクセスポイントを削除します.
* @param ipAddress 削除するアクセスポイントのIPアドレス
* @return 削除した個数
*/
synchronized int removeAccessPointByIpAddress(final String ipAddress) {
String whereClause = COL_IP_ADDRESS + "=?";
String[] whereArgs = {
ipAddress
};
SQLiteDatabase db = mDBHelper.getWritableDatabase();
try {
return db.delete(TBL_NAME, whereClause, whereArgs);
} finally {
db.close();
}
}
/**
* アクセスポイント一覧を取得します.
* @return アクセスポイント
*/
synchronized List<PHAccessPoint> getAccessPoints() {
String sql = "SELECT * FROM " + TBL_NAME;
String[] selectionArgs = {};
SQLiteDatabase db = mDBHelper.getReadableDatabase();
Cursor cursor = db.rawQuery(sql, selectionArgs);
try {
List<PHAccessPoint> accessPoints = new ArrayList<PHAccessPoint>();
boolean next = cursor.moveToFirst();
while (next) {
PHAccessPoint accessPoint = new PHAccessPoint();
accessPoint.setUsername(cursor.getString(cursor.getColumnIndex(COL_USER_NAME)));
accessPoint.setIpAddress(cursor.getString(cursor.getColumnIndex(COL_IP_ADDRESS)));
accessPoint.setMacAddress(cursor.getString(cursor.getColumnIndex(COL_MAC_ADDRESS)));
accessPoints.add(accessPoint);
next = cursor.moveToNext();
}
return accessPoints;
} finally {
cursor.close();
}
}
/**
* アクセスポイント情報を更新します.
* @param accessPoint 更新するアクセスポイント情報
* @return 更新したアクセスポイントの個数
*/
synchronized long updateAccessPoint(final PHAccessPoint accessPoint) {
ContentValues values = new ContentValues();
values.put(COL_USER_NAME, accessPoint.getUsername());
values.put(COL_IP_ADDRESS, accessPoint.getIpAddress());
String whereClause = COL_MAC_ADDRESS + "=?";
String[] whereArgs = {
accessPoint.getMacAddress()
};
SQLiteDatabase db = mDBHelper.getWritableDatabase();
try {
return db.update(TBL_NAME, values, whereClause, whereArgs);
} finally {
db.close();
}
}
synchronized PHAccessPoint getAccessPointByMacAddress(final String macAddress) {
String sql = "SELECT * FROM " + TBL_NAME + " WHERE " + COL_MAC_ADDRESS + "=?";
String[] whereArgs = {
macAddress
};
SQLiteDatabase db = mDBHelper.getReadableDatabase();
Cursor cursor = db.rawQuery(sql, whereArgs);
try {
if (cursor.moveToFirst()) {
PHAccessPoint accessPoint = new PHAccessPoint();
accessPoint.setUsername(cursor.getString(cursor.getColumnIndex(COL_USER_NAME)));
accessPoint.setIpAddress(cursor.getString(cursor.getColumnIndex(COL_IP_ADDRESS)));
accessPoint.setMacAddress(cursor.getString(cursor.getColumnIndex(COL_MAC_ADDRESS)));
return accessPoint;
} else {
return null;
}
} finally {
cursor.close();
}
}
/**
* 指定されたアクセスポイントが格納されているかを確認します.
* @param accessPoint 存在確認をするアクセスポイント
* @return 存在する場合にはtrue、それ以外はfalse
*/
synchronized boolean hasAccessPoint(final PHAccessPoint accessPoint) {
String sql = "SELECT * FROM " + TBL_NAME + " WHERE " + COL_MAC_ADDRESS + "=?";
String[] whereArgs = {
accessPoint.getMacAddress()
};
SQLiteDatabase db = mDBHelper.getReadableDatabase();
Cursor cursor = db.rawQuery(sql, whereArgs);
try {
return cursor.moveToFirst();
} finally {
cursor.close();
}
}
private static class DBHelper extends SQLiteOpenHelper {
DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(final SQLiteDatabase db) {
createDB(db);
}
@Override
public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TBL_NAME);
createDB(db);
}
private void createDB(final SQLiteDatabase db) {
String sql = "CREATE TABLE " + TBL_NAME + " ("
+ BaseColumns._ID + " INTEGER PRIMARY KEY, "
+ COL_USER_NAME + " TEXT NOT NULL, "
+ COL_IP_ADDRESS + " TEXT NOT NULL, "
+ COL_MAC_ADDRESS + " TEXT NOT NULL "
+ ");";
db.execSQL(sql);
}
}
}