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<String, SQLiteDatabase> 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<String, String> 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<String, Pair<File, String>> 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<String> 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();
|
}
|
}
|
|
}
|