/* LinkingDBAdapter.java Copyright (c) 2016 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.linking.beacon; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteQueryBuilder; import android.provider.BaseColumns; import android.text.TextUtils; import android.util.Log; import org.deviceconnect.android.deviceplugin.linking.BuildConfig; import org.deviceconnect.android.deviceplugin.linking.R; import org.deviceconnect.android.deviceplugin.linking.beacon.data.AtmosphericPressureData; import org.deviceconnect.android.deviceplugin.linking.beacon.data.BatteryData; import org.deviceconnect.android.deviceplugin.linking.beacon.data.GattData; import org.deviceconnect.android.deviceplugin.linking.beacon.data.HumidityData; import org.deviceconnect.android.deviceplugin.linking.beacon.data.LinkingBeacon; import org.deviceconnect.android.deviceplugin.linking.beacon.data.RawData; import org.deviceconnect.android.deviceplugin.linking.beacon.data.TemperatureData; import java.util.ArrayList; import java.util.List; class LinkingDBAdapter { private static final String TAG = "LinkingDB"; private static final String DB_FILE_NAME = "linking_beacon.db"; private static final int DB_VERSION = 1; private static final String TABLE_BEACON = "table_beacon"; private static final String TABLE_GATT = "table_gatt"; private static final String TABLE_TEMPERATURE = "table_temperature"; private static final String TABLE_HUMIDITY = "table_humidity"; private static final String TABLE_ATMOSPHERIC_PRESSURE = "table_atmospheric_pressure"; private static final String TABLE_BATTERY = "table_battery"; private static final String TABLE_RAW_DATA = "table_raw_data"; private LinkingDatabaseHelper mHelper; private Context mContext; public LinkingDBAdapter(final Context context) { mContext = context; mHelper = new LinkingDatabaseHelper(context); } public void delete(final LinkingBeacon beacon) { if (BuildConfig.DEBUG) { Log.d(TAG, "LinkingDBAdapter#delete"); Log.d(TAG, beacon.toString()); } deleteGatt(beacon); deleteTemperature(beacon); deleteHumidity(beacon); deleteAtmosphericPressure(beacon); deleteBattery(beacon); deleteRawData(beacon); deleteBeacon(beacon); } public void deleteAll() { delete(TABLE_BEACON, null, null); delete(TABLE_GATT, null, null); delete(TABLE_TEMPERATURE, null, null); delete(TABLE_HUMIDITY, null, null); delete(TABLE_ATMOSPHERIC_PRESSURE, null, null); delete(TABLE_BATTERY, null, null); delete(TABLE_RAW_DATA, null, null); } public boolean insertBeacon(final LinkingBeacon beacon) { ContentValues values = new ContentValues(); values.put(BeaconColumns.VENDOR_ID, beacon.getVendorId()); values.put(BeaconColumns.EXTRA_ID, beacon.getExtraId()); values.put(BeaconColumns.VERSION, beacon.getVersion()); SQLiteDatabase db = mHelper.getWritableDatabase(); long ret; try { ret = db.insert(TABLE_BEACON, null, values); } finally { db.close(); } return ret > 0; } public List<LinkingBeacon> queryBeacons() { List<LinkingBeacon> list = new ArrayList<>(); Cursor cursor = query( TABLE_BEACON, null, null, null, BaseColumns._ID + " DESC"); if (cursor != null) { try { if (cursor.moveToFirst()) { do { LinkingBeacon beacon = new LinkingBeacon(); beacon.setVendorId(cursor.getInt(cursor.getColumnIndex(BeaconColumns.VENDOR_ID))); beacon.setExtraId(cursor.getInt(cursor.getColumnIndex(BeaconColumns.EXTRA_ID))); beacon.setVersion(cursor.getInt(cursor.getColumnIndex(BeaconColumns.VERSION))); beacon.setGattData(queryGatt(beacon)); beacon.setTemperatureData(queryTemperature(beacon)); beacon.setAtmosphericPressureData(queryAtmosphericPressure(beacon)); beacon.setHumidityData(queryHumidity(beacon)); beacon.setBatteryData(queryBattery(beacon)); beacon.setRawData(queryRawData(beacon.getVendorId(), beacon.getExtraId())); beacon.setDisplayName(mContext.getString(R.string.linking_beacon_display_name, beacon.getExtraId())); list.add(beacon); } while (cursor.moveToNext()); } } catch (Exception e) { if (BuildConfig.DEBUG) { Log.w(TAG, "", e); } } finally { cursor.close(); } } return list; } public boolean deleteBeacon(final LinkingBeacon beacon) { String selection = LinkingBaseColumns.VENDOR_ID + "=? AND " + LinkingBaseColumns.EXTRA_ID + "=?"; String[] selectionArgs = { String.valueOf(beacon.getVendorId()), String.valueOf(beacon.getExtraId()) }; try { int row = delete(TABLE_BEACON, selection, selectionArgs); return row > 0; } catch (Exception e) { if (BuildConfig.DEBUG) { Log.e(TAG, "", e); } } return false; } public boolean insertGatt(final LinkingBeacon beacon, GattData gatt) { return insertGatt(beacon.getVendorId(), beacon.getExtraId(), gatt); } public boolean insertGatt(final int vendorId, final int extraId, final GattData gatt) { ContentValues values = new ContentValues(); values.put(GattColumns.VENDOR_ID, vendorId); values.put(GattColumns.EXTRA_ID, extraId); values.put(GattColumns.RSSI, gatt.getRssi()); values.put(GattColumns.TX_POWER, gatt.getTxPower()); values.put(GattColumns.DISTANCE, gatt.getDistance()); values.put(GattColumns.TIME_STAMP, gatt.getTimeStamp()); SQLiteDatabase db = mHelper.getWritableDatabase(); long ret; try { ret = db.insert(TABLE_GATT, null, values); } finally { db.close(); } return ret > 0; } public GattData queryGatt(final LinkingBeacon beacon) { return queryGatt(beacon.getVendorId(), beacon.getExtraId()); } public GattData queryGatt(final int vendorId, final int extraId) { String selection = GattColumns.VENDOR_ID + "=? AND " + GattColumns.EXTRA_ID + "=?"; String[] selectionArgs = { String.valueOf(vendorId), String.valueOf(extraId) }; Cursor cursor = query( TABLE_GATT, null, selection, selectionArgs, GattColumns.TIME_STAMP + " DESC"); if (cursor != null) { try { if (cursor.moveToFirst()) { GattData gatt = new GattData(); gatt.setRssi(cursor.getInt(cursor.getColumnIndex(GattColumns.RSSI))); gatt.setTxPower(cursor.getInt(cursor.getColumnIndex(GattColumns.TX_POWER))); gatt.setDistance(cursor.getInt(cursor.getColumnIndex(GattColumns.DISTANCE))); gatt.setTimeStamp(cursor.getLong(cursor.getColumnIndex(GattColumns.TIME_STAMP))); return gatt; } } catch (Exception e) { if (BuildConfig.DEBUG) { Log.w(TAG, "", e); } } finally { cursor.close(); } } return null; } public boolean deleteGatt(final LinkingBeacon beacon) { return deleteGatt(beacon.getVendorId(), beacon.getExtraId()); } public boolean deleteGatt(final int vendorId, final int extraId) { String selection = LinkingBaseColumns.VENDOR_ID + "=? AND " + LinkingBaseColumns.EXTRA_ID + "=?"; String[] selectionArgs = { String.valueOf(vendorId), String.valueOf(extraId) }; try { int row = delete(TABLE_GATT, selection, selectionArgs); if (BuildConfig.DEBUG) { Log.d(TAG, "LinkingDBAdapter#deleteGatt: " + row); } return row > 0; } catch (Exception e) { if (BuildConfig.DEBUG) { Log.e(TAG, "", e); } } return false; } public boolean insertTemperature(final LinkingBeacon beacon, final TemperatureData temp) { return insertTemperature(beacon.getVendorId(), beacon.getExtraId(), temp); } public boolean insertTemperature(final int vendorId, final int extraId, final TemperatureData temp) { ContentValues values = new ContentValues(); values.put(TemperatureColumns.VENDOR_ID, vendorId); values.put(TemperatureColumns.EXTRA_ID, extraId); values.put(TemperatureColumns.TEMPERATURE, temp.getValue()); values.put(TemperatureColumns.TIME_STAMP, temp.getTimeStamp()); SQLiteDatabase db = mHelper.getWritableDatabase(); long ret; try { ret = db.insert(TABLE_TEMPERATURE, null, values); } finally { db.close(); } return ret > 0; } public TemperatureData queryTemperature(final LinkingBeacon beacon) { return queryTemperature(beacon.getVendorId(), beacon.getExtraId()); } public TemperatureData queryTemperature(final int vendorId, final int extraId) { String selection = GattColumns.VENDOR_ID + "=? AND " + GattColumns.EXTRA_ID + "=?"; String[] selectionArgs = { String.valueOf(vendorId), String.valueOf(extraId) }; Cursor cursor = query( TABLE_TEMPERATURE, null, selection, selectionArgs, GattColumns.TIME_STAMP + " DESC"); if (cursor != null) { try { if (cursor.moveToFirst()) { TemperatureData temp = new TemperatureData(); temp.setValue(cursor.getFloat(cursor.getColumnIndex(TemperatureColumns.TEMPERATURE))); temp.setTimeStamp(cursor.getLong(cursor.getColumnIndex(TemperatureColumns.TIME_STAMP))); return temp; } } catch (Exception e) { if (BuildConfig.DEBUG) { Log.w(TAG, "", e); } } finally { cursor.close(); } } return null; } public boolean deleteTemperature(final LinkingBeacon beacon) { return deleteTemperature(beacon.getVendorId(), beacon.getExtraId()); } public boolean deleteTemperature(final int vendorId, final int extraId) { String selection = LinkingBaseColumns.VENDOR_ID + "=? AND " + LinkingBaseColumns.EXTRA_ID + "=?"; String[] selectionArgs = { String.valueOf(vendorId), String.valueOf(extraId) }; try { int row = delete(TABLE_TEMPERATURE, selection, selectionArgs); if (BuildConfig.DEBUG) { Log.d(TAG, "LinkingDBAdapter#deleteTemperature: " + row); } return row > 0; } catch (Exception e) { if (BuildConfig.DEBUG) { Log.e(TAG, "", e); } } return false; } public boolean insertHumidity(final LinkingBeacon beacon, final HumidityData humidity) { return insertHumidity(beacon.getVendorId(), beacon.getExtraId(), humidity); } public boolean insertHumidity(final int vendorId, final int extraId, final HumidityData humidity) { ContentValues values = new ContentValues(); values.put(HumidityColumns.VENDOR_ID, vendorId); values.put(HumidityColumns.EXTRA_ID, extraId); values.put(HumidityColumns.HUMIDITY, humidity.getValue()); values.put(HumidityColumns.TIME_STAMP, humidity.getTimeStamp()); SQLiteDatabase db = mHelper.getWritableDatabase(); long ret; try { ret = db.insert(TABLE_HUMIDITY, null, values); } finally { db.close(); } return ret > 0; } public HumidityData queryHumidity(final LinkingBeacon beacon) { return queryHumidity(beacon.getVendorId(), beacon.getExtraId()); } public HumidityData queryHumidity(final int vendorId, final int extraId) { String selection = HumidityColumns.VENDOR_ID + "=? AND " + HumidityColumns.EXTRA_ID + "=?"; String[] selectionArgs = { String.valueOf(vendorId), String.valueOf(extraId) }; Cursor cursor = query( TABLE_HUMIDITY, null, selection, selectionArgs, GattColumns.TIME_STAMP + " DESC"); if (cursor != null) { try { if (cursor.moveToFirst()) { HumidityData humidity = new HumidityData(); humidity.setValue(cursor.getFloat(cursor.getColumnIndex(HumidityColumns.HUMIDITY))); humidity.setTimeStamp(cursor.getLong(cursor.getColumnIndex(HumidityColumns.TIME_STAMP))); return humidity; } } catch (Exception e) { if (BuildConfig.DEBUG) { Log.w(TAG, "", e); } } finally { cursor.close(); } } return null; } public boolean deleteHumidity(final LinkingBeacon beacon) { return deleteHumidity(beacon.getVendorId(), beacon.getExtraId()); } public boolean deleteHumidity(final int vendorId, final int extraId) { String selection = LinkingBaseColumns.VENDOR_ID + "=? AND " + LinkingBaseColumns.EXTRA_ID + "=?"; String[] selectionArgs = { String.valueOf(vendorId), String.valueOf(extraId) }; try { int row = delete(TABLE_HUMIDITY, selection, selectionArgs); if (BuildConfig.DEBUG) { Log.d(TAG, "LinkingDBAdapter#deleteHumidity: " + row); } return row > 0; } catch (Exception e) { if (BuildConfig.DEBUG) { Log.e(TAG, "", e); } } return false; } public boolean insertAtmosphericPressure(final LinkingBeacon beacon, final AtmosphericPressureData ap) { return insertAtmosphericPressure(beacon.getVendorId(), beacon.getExtraId(), ap); } public boolean insertAtmosphericPressure(final int vendorId, final int extraId, final AtmosphericPressureData ap) { ContentValues values = new ContentValues(); values.put(AtmosphericPressure.VENDOR_ID, vendorId); values.put(AtmosphericPressure.EXTRA_ID, extraId); values.put(AtmosphericPressure.ATMOSPHERIC_PRESSURE, ap.getValue()); values.put(AtmosphericPressure.TIME_STAMP, ap.getTimeStamp()); SQLiteDatabase db = mHelper.getWritableDatabase(); long ret; try { ret = db.insert(TABLE_ATMOSPHERIC_PRESSURE, null, values); } finally { db.close(); } return ret > 0; } public AtmosphericPressureData queryAtmosphericPressure(final LinkingBeacon beacon) { return queryAtmosphericPressure(beacon.getVendorId(), beacon.getExtraId()); } public AtmosphericPressureData queryAtmosphericPressure(final int vendorId, final int extraId) { String selection = AtmosphericPressure.VENDOR_ID + "=? AND " + AtmosphericPressure.EXTRA_ID + "=?"; String[] selectionArgs = { String.valueOf(vendorId), String.valueOf(extraId) }; Cursor cursor = query( TABLE_ATMOSPHERIC_PRESSURE, null, selection, selectionArgs, GattColumns.TIME_STAMP + " DESC"); if (cursor != null) { try { if (cursor.moveToFirst()) { AtmosphericPressureData ap = new AtmosphericPressureData(); ap.setValue(cursor.getFloat(cursor.getColumnIndex(AtmosphericPressure.ATMOSPHERIC_PRESSURE))); ap.setTimeStamp(cursor.getLong(cursor.getColumnIndex(AtmosphericPressure.TIME_STAMP))); return ap; } } catch (Exception e) { if (BuildConfig.DEBUG) { Log.w(TAG, "", e); } } finally { cursor.close(); } } return null; } public boolean deleteAtmosphericPressure(final LinkingBeacon beacon) { return deleteAtmosphericPressure(beacon.getVendorId(), beacon.getExtraId()); } public boolean deleteAtmosphericPressure(final int vendorId, final int extraId) { String selection = LinkingBaseColumns.VENDOR_ID + "=? AND " + LinkingBaseColumns.EXTRA_ID + "=?"; String[] selectionArgs = { String.valueOf(vendorId), String.valueOf(extraId) }; try { int row = delete(TABLE_ATMOSPHERIC_PRESSURE, selection, selectionArgs); if (BuildConfig.DEBUG) { Log.d(TAG, "LinkingDBAdapter#deleteAtmosphericPressure: " + row); } return row > 0; } catch (Exception e) { if (BuildConfig.DEBUG) { Log.e(TAG, "", e); } } return false; } public boolean insertBattery(final LinkingBeacon beacon, final BatteryData battery) { return insertBattery(beacon.getVendorId(), beacon.getExtraId(), battery); } public boolean insertBattery(final int vendorId, final int extraId, final BatteryData battery) { ContentValues values = new ContentValues(); values.put(BatteryColumns.VENDOR_ID, vendorId); values.put(BatteryColumns.EXTRA_ID, extraId); values.put(BatteryColumns.LEVEL, battery.getLevel()); values.put(BatteryColumns.LOW_BATTERY, battery.isLowBatteryFlag() ? 1 : 0); values.put(BatteryColumns.TIME_STAMP, battery.getTimeStamp()); SQLiteDatabase db = mHelper.getWritableDatabase(); long ret; try { ret = db.insert(TABLE_BATTERY, null, values); } finally { db.close(); } return ret > 0; } public BatteryData queryBattery(final LinkingBeacon beacon) { return queryBattery(beacon.getVendorId(), beacon.getExtraId()); } public BatteryData queryBattery(final int vendorId, final int extraId) { String selection = BatteryColumns.VENDOR_ID + "=? AND " + BatteryColumns.EXTRA_ID + "=?"; String[] selectionArgs = { String.valueOf(vendorId), String.valueOf(extraId) }; Cursor cursor = query( TABLE_BATTERY, null, selection, selectionArgs, GattColumns.TIME_STAMP + " DESC"); if (cursor != null) { try { if (cursor.moveToFirst()) { BatteryData battery = new BatteryData(); battery.setLevel(cursor.getFloat(cursor.getColumnIndex(BatteryColumns.LEVEL))); battery.setLowBatteryFlag(cursor.getInt(cursor.getColumnIndex(BatteryColumns.LOW_BATTERY)) == 1); battery.setTimeStamp(cursor.getLong(cursor.getColumnIndex(BatteryColumns.TIME_STAMP))); return battery; } } catch (Exception e) { if (BuildConfig.DEBUG) { Log.w(TAG, "", e); } } finally { cursor.close(); } } return null; } public boolean deleteBattery(final LinkingBeacon beacon) { return deleteBattery(beacon.getVendorId(), beacon.getExtraId()); } public boolean deleteBattery(final int vendorId, final int extraId) { String selection = LinkingBaseColumns.VENDOR_ID + "=? AND " + LinkingBaseColumns.EXTRA_ID + "=?"; String[] selectionArgs = { String.valueOf(vendorId), String.valueOf(extraId) }; try { int row = delete(TABLE_BATTERY, selection, selectionArgs); if (BuildConfig.DEBUG) { Log.d(TAG, "LinkingDBAdapter#deleteBattery: " + row); } return row > 0; } catch (Exception e) { if (BuildConfig.DEBUG) { Log.e(TAG, "", e); } } return false; } public boolean insertRawData(final LinkingBeacon beacon, final RawData raw) { return insertRawData(beacon.getVendorId(), beacon.getExtraId(), raw); } public boolean insertRawData(final int vendorId, final int extraId, final RawData raw) { ContentValues values = new ContentValues(); values.put(RawDataColumns.VENDOR_ID, vendorId); values.put(RawDataColumns.EXTRA_ID, extraId); values.put(RawDataColumns.RAW_DATA, raw.getValue()); values.put(RawDataColumns.TIME_STAMP, raw.getTimeStamp()); SQLiteDatabase db = mHelper.getWritableDatabase(); long ret; try { ret = db.insert(TABLE_RAW_DATA, null, values); } finally { db.close(); } return ret > 0; } public RawData queryRawData(final LinkingBeacon beacon) { return queryRawData(beacon.getVendorId(), beacon.getExtraId()); } public RawData queryRawData(final int vendorId, final int extraId) { String selection = RawDataColumns.VENDOR_ID + "=? AND " + RawDataColumns.EXTRA_ID + "=?"; String[] selectionArgs = { String.valueOf(vendorId), String.valueOf(extraId) }; Cursor cursor = query( TABLE_RAW_DATA, null, selection, selectionArgs, GattColumns.TIME_STAMP + " DESC"); if (cursor != null) { try { if (cursor.moveToFirst()) { RawData raw = new RawData(); raw.setValue(cursor.getInt(cursor.getColumnIndex(RawDataColumns.RAW_DATA))); raw.setTimeStamp(cursor.getLong(cursor.getColumnIndex(RawDataColumns.TIME_STAMP))); return raw; } } catch (Exception e) { if (BuildConfig.DEBUG) { Log.w(TAG, "", e); } } finally { cursor.close(); } } return null; } public boolean deleteRawData(final LinkingBeacon beacon) { return deleteRawData(beacon.getVendorId(), beacon.getExtraId()); } public boolean deleteRawData(final int vendorId, final int extraId) { String selection = LinkingBaseColumns.VENDOR_ID + "=? AND " + LinkingBaseColumns.EXTRA_ID + "=?"; String[] selectionArgs = { String.valueOf(vendorId), String.valueOf(extraId) }; try { int row = delete(TABLE_RAW_DATA, selection, selectionArgs); if (BuildConfig.DEBUG) { Log.d(TAG, "LinkingDBAdapter#deleteRawData: " + row); } return row > 0; } catch (Exception e) { if (BuildConfig.DEBUG) { Log.e(TAG, "", e); } } return false; } private Cursor query(final String tbl, final String[] projection, final String selection, final String[] selectionArgs, final String sortOrder) { SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); qb.setTables(tbl); String orderBy; if (TextUtils.isEmpty(sortOrder)) { orderBy = null; } else { orderBy = sortOrder; } SQLiteDatabase mdb = mHelper.getReadableDatabase(); return qb.query(mdb, projection, selection, selectionArgs, null, null, orderBy); } private int delete(final String tbl, final String selection, final String[] selectionArgs) { SQLiteDatabase mdb = mHelper.getWritableDatabase(); return mdb.delete(tbl, selection, selectionArgs); } private class LinkingDatabaseHelper extends SQLiteOpenHelper { public LinkingDatabaseHelper(final Context context) { super(context, DB_FILE_NAME, null, DB_VERSION); } @Override public void onCreate(final SQLiteDatabase db) { createBeaconTable(db); createGattTable(db); createTemperatureTable(db); createHumidityTable(db); createAtmosphericPressureTable(db); createBatteryTable(db); createRawDataTable(db); } @Override public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) { } @Override public void onDowngrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) { super.onDowngrade(db, oldVersion, newVersion); } private void createBeaconTable(final SQLiteDatabase db) { String sql = "CREATE TABLE " + TABLE_BEACON + " (_id INTEGER PRIMARY KEY," + BeaconColumns.VENDOR_ID + " INTEGER," + BeaconColumns.EXTRA_ID + " INTEGER," + BeaconColumns.VERSION + " INTEGER," + BeaconColumns.TIME_STAMP + " INTEGER);"; db.execSQL(sql); } private void createGattTable(final SQLiteDatabase db) { String sql = "CREATE TABLE " + TABLE_GATT + " (_id INTEGER PRIMARY KEY," + GattColumns.VENDOR_ID + " INTEGER," + GattColumns.EXTRA_ID + " INTEGER," + GattColumns.TIME_STAMP + " INTEGER," + GattColumns.RSSI + " INTEGER," + GattColumns.TX_POWER + " INTEGER," + GattColumns.DISTANCE + " INTEGER" + ");"; db.execSQL(sql); } private void createTemperatureTable(final SQLiteDatabase db) { String sql = "CREATE TABLE " + TABLE_TEMPERATURE + " (_id INTEGER PRIMARY KEY," + TemperatureColumns.VENDOR_ID + " INTEGER," + TemperatureColumns.EXTRA_ID + " INTEGER," + TemperatureColumns.TIME_STAMP + " INTEGER," + TemperatureColumns.TEMPERATURE + " REAL" + ");"; db.execSQL(sql); } private void createHumidityTable(final SQLiteDatabase db) { String sql = "CREATE TABLE " + TABLE_HUMIDITY + " (_id INTEGER PRIMARY KEY," + HumidityColumns.VENDOR_ID + " INTEGER," + HumidityColumns.EXTRA_ID + " INTEGER," + HumidityColumns.TIME_STAMP + " INTEGER," + HumidityColumns.HUMIDITY + " REAL" + ");"; db.execSQL(sql); } private void createAtmosphericPressureTable(final SQLiteDatabase db) { String sql = "CREATE TABLE " + TABLE_ATMOSPHERIC_PRESSURE + " (_id INTEGER PRIMARY KEY," + AtmosphericPressure.VENDOR_ID + " INTEGER," + AtmosphericPressure.EXTRA_ID + " INTEGER," + AtmosphericPressure.TIME_STAMP + " INTEGER," + AtmosphericPressure.ATMOSPHERIC_PRESSURE + " REAL" + ");"; db.execSQL(sql); } private void createBatteryTable(final SQLiteDatabase db) { String sql = "CREATE TABLE " + TABLE_BATTERY + " (_id INTEGER PRIMARY KEY," + BatteryColumns.VENDOR_ID + " INTEGER," + BatteryColumns.EXTRA_ID + " INTEGER," + BatteryColumns.TIME_STAMP + " INTEGER," + BatteryColumns.LOW_BATTERY + " INTEGER," + BatteryColumns.LEVEL + " REAL" + ");"; db.execSQL(sql); } private void createRawDataTable(final SQLiteDatabase db) { String sql = "CREATE TABLE " + TABLE_RAW_DATA + " (_id INTEGER PRIMARY KEY," + RawDataColumns.VENDOR_ID + " INTEGER," + RawDataColumns.EXTRA_ID + " INTEGER," + RawDataColumns.TIME_STAMP + " INTEGER," + RawDataColumns.RAW_DATA + " INTEGER" + ");"; db.execSQL(sql); } } public interface LinkingBaseColumns extends BaseColumns { String VENDOR_ID = "vendor_id"; String EXTRA_ID = "extra_id"; String TIME_STAMP = "time_stamp"; } public interface BeaconColumns extends LinkingBaseColumns { String VERSION = "version"; } public interface GattColumns extends LinkingBaseColumns { String RSSI = "rssi"; String TX_POWER = "tx_power"; String DISTANCE = "distance"; } public interface TemperatureColumns extends LinkingBaseColumns { String TEMPERATURE = "temperature"; } public interface HumidityColumns extends LinkingBaseColumns { String HUMIDITY = "humidity"; } public interface AtmosphericPressure extends LinkingBaseColumns { String ATMOSPHERIC_PRESSURE = "atmospheric_pressure"; } public interface BatteryColumns extends LinkingBaseColumns { String LOW_BATTERY = "low_battery"; String LEVEL = "level"; } public interface RawDataColumns extends LinkingBaseColumns { String RAW_DATA = "raw_data"; } }