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