package com.basic.security.dao; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.util.Pair; import com.basic.security.base.BaseApplication; import com.basic.security.model.Log; import com.basic.security.model.Setting; import com.basic.security.utils.Constants; import java.io.File; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import static android.content.Context.MODE_PRIVATE; public class DatabaseManager { public static final Lock databaseLock = new ReentrantLock(); public static final Lock databaseExecSqlLock = new ReentrantLock(); public static Map databaseMap = new HashMap<>(); public static Class[] tableClasses = new Class[] { Setting.class, Log.class }; public static SQLiteDatabase getDatabase() {// return getDatabase(Constants.databaseName); } public static void intiTables() {// for (Class tableClass : tableClasses) { String table = tableClass.getSimpleName(); Map columns = new HashMap<>(); Field[] declaredFields = tableClass.getDeclaredFields(); for (Field field : declaredFields) { try { String fieldName = field.getName(); String value = (String)field.get(null); if (value != null) { if ("table".equals(fieldName)) { table = value; } else { columns.put(value, value); } } } catch (Exception e) { System.out.println("reflect "+e.getMessage()); } } columns.put("id", "id"); String createTable = "CREATE TABLE IF NOT EXISTS " + table + " ("; for (String column : columns.keySet()) { createTable += column + " TEXT, "; } createTable += " PRIMARY KEY(id))"; if (table.equals("RealTimeMetrics")) { createTable = createTable.replace("TEXT", "INTEGER"); createTable = createTable.replace("id INTEGER", "id TEXT"); // System.out.println("createTable="+createTable); } DatabaseManager.execSQL(createTable); String createIndex = "CREATE UNIQUE INDEX IF NOT EXISTS idx_"+table+" ON "+table+"(id)"; DatabaseManager.execSQL(createIndex); } DatabaseManager.execSQL("CREATE TABLE IF NOT EXISTS alarm (\"matchPersonListStr\" TEXT, property TEXT, \"alarmLargePicture\" TEXT,\"alarmPerson\" TEXT,\"alarmPicture\" TEXT,\"alarmVideo\" TEXT,\"alarmTime\" TEXT,\"alarmAddress\" TEXT,\"alarmType\" TEXT,\"id\" TEXT, \"createTime\" TEXT, \"closeAlarm\" TEXT, \"mute\" TEXT, PRIMARY KEY(id))"); try { DatabaseManager.execSQL("ALTER TABLE alarm ADD COLUMN imgKey text"); } catch (Exception e) { e.printStackTrace(); } try { DatabaseManager.execSQL("ALTER TABLE alarm ADD COLUMN indeviceid text"); } catch (Exception e) { e.printStackTrace(); } try { DatabaseManager.execSQL("ALTER TABLE alarm ADD COLUMN videoReqNum text"); } catch (Exception e) { e.printStackTrace(); } try { DatabaseManager.execSQL("ALTER TABLE alarm ADD COLUMN picDate text"); } catch (Exception e) { e.printStackTrace(); } DatabaseManager.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS idx_alarm ON alarm(id)"); // DatabaseManager.execSQL("CREATE TABLE IF NOT EXISTS setting (\"id\" TEXT, \"name\" TEXT, PRIMARY KEY(id))"); // DatabaseManager.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS idx_setting ON setting (id)"); } public static SQLiteDatabase getDatabase(String databaseName) {// SQLiteDatabase database = databaseMap.get(databaseName); try { databaseLock.lock(); if (database == null) { // database = BaseApplication.getApplication().openOrCreateDatabase(Constants.databaseName, MODE_PRIVATE, null); database = SQLiteDatabase.openOrCreateDatabase(databaseName, null); databaseMap.put(databaseName, database); intiTables(); setCustomDatabaseFiles(BaseApplication.getApplication()); initTableColumnNames(); } } catch (Exception e) { e.printStackTrace(); } finally { databaseLock.unlock(); } return database; } public static void execSQL(String sql) { try { databaseExecSqlLock.lock(); getDatabase().execSQL(sql); } finally { databaseExecSqlLock.unlock(); } } public static void setCustomDatabaseFiles(Context context) { try { Class debugDB = Class.forName("com.amitshekhar.DebugDB"); Class[] argTypes = new Class[]{HashMap.class}; Method setCustomDatabaseFiles = debugDB.getMethod("setCustomDatabaseFiles", argTypes); HashMap> customDatabaseFiles = new HashMap<>(); customDatabaseFiles.put("base_database",new Pair<>(new File(Constants.databaseName), "")); setCustomDatabaseFiles.invoke(null, customDatabaseFiles); } catch (Exception ignore) { ignore.printStackTrace(); } } private static void initTableColumnNames() {// SQLiteDatabase mDataBase = DatabaseManager.getDatabase(); Cursor c = mDataBase.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null); List tableNameList = new ArrayList<>(); if (c.moveToFirst()) { while (!c.isAfterLast()) { tableNameList.add(c.getString(0)); c.moveToNext(); } } c.close(); for (String tableName : tableNameList) { Cursor dbCursor = mDataBase.query(tableName, null, null, null, null, null, null); String[] columnNames = dbCursor.getColumnNames(); SqliteManager.tableColumnNames.put(tableName, Arrays.asList(columnNames)); dbCursor.close(); } } }