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.utils.Constants; import java.io.File; 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 SQLiteDatabase getDatabase() { return getDatabase(Constants.databaseName); } public static void intiTables() { 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))"); 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); 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(); } } }