DBUtility.java 源代码
package org.litepal.util;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.text.TextUtils;
import com.ss.android.socialbase.downloader.constants.DBDefinition;
import com.xiaomi.mipush.sdk.Constants;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.litepal.exceptions.DatabaseGenerateException;
import org.litepal.tablemanager.model.TableModel;
import org.litepal.util.Const;
public class DBUtility {
private static final String KEYWORDS_COLUMN_SUFFIX = "_lpcolumn";
private static final String REG_COLLECTION = "\\s+(not\\s+)?(in)\\s*\\(";
private static final String REG_FUZZY = "\\s+(not\\s+)?(like|between)\\s+";
private static final String REG_OPERATOR = "\\s*(=|!=|<>|<|>)";
private static final String SQLITE_KEYWORDS = ",abort,add,after,all,alter,and,as,asc,autoincrement,before,begin,between,by,cascade,check,collate,column,commit,conflict,constraint,create,cross,database,deferrable,deferred,delete,desc,distinct,drop,each,end,escape,except,exclusive,exists,foreign,from,glob,group,having,in,index,inner,insert,intersect,into,is,isnull,join,like,limit,match,natural,not,notnull,null,of,offset,on,or,order,outer,plan,pragma,primary,query,raise,references,regexp,reindex,release,rename,replace,restrict,right,rollback,row,savepoint,select,set,table,temp,temporary,then,to,transaction,trigger,union,unique,update,using,vacuum,values,view,virtual,when,where,";
private static final String TAG = "DBUtility";
private DBUtility() {
}
public static String getTableNameByClassName(String str) {
if (TextUtils.isEmpty(str) || '.' == str.charAt(str.length() - 1)) {
return null;
}
return str.substring(str.lastIndexOf(".") + 1);
}
public static List<String> getTableNameListByClassNameList(List<String> list) {
ArrayList arrayList = new ArrayList();
if (list != null && !list.isEmpty()) {
Iterator<String> it = list.iterator();
while (it.hasNext()) {
arrayList.add(getTableNameByClassName(it.next()));
}
}
return arrayList;
}
public static String getTableNameByForeignColumn(String str) {
if (TextUtils.isEmpty(str) || !str.toLowerCase(Locale.US).endsWith(DBDefinition.ID)) {
return null;
}
return str.substring(0, str.length() - 3);
}
public static String getIntermediateTableName(String str, String str2) {
if (TextUtils.isEmpty(str) || TextUtils.isEmpty(str2)) {
return null;
}
if (str.toLowerCase(Locale.US).compareTo(str2.toLowerCase(Locale.US)) <= 0) {
return str + "_" + str2;
}
return str2 + "_" + str;
}
public static String getGenericTableName(String str, String str2) {
return BaseUtility.changeCase(getTableNameByClassName(str) + "_" + str2);
}
public static String getGenericValueIdColumnName(String str) {
return BaseUtility.changeCase(getTableNameByClassName(str) + DBDefinition.ID);
}
public static String getM2MSelfRefColumnName(Field field) {
return BaseUtility.changeCase(field.getName() + DBDefinition.ID);
}
public static boolean isIntermediateTable(String str, SQLiteDatabase sQLiteDatabase) {
if (TextUtils.isEmpty(str) || !str.matches("[0-9a-zA-Z]+_[0-9a-zA-Z]+")) {
return false;
}
Cursor cursor = null;
try {
try {
cursor = sQLiteDatabase.query(Const.TableSchema.TABLE_NAME, null, null, null, null, null, null);
} catch (Exception e) {
e.printStackTrace();
if (cursor == null) {
return false;
}
cursor.close();
return false;
}
} catch (Throwable th) {
if (cursor != null) {
cursor.close();
}
throw th;
}
}
public static boolean isGenericTable(String str, SQLiteDatabase sQLiteDatabase) {
if (TextUtils.isEmpty(str) || !str.matches("[0-9a-zA-Z]+_[0-9a-zA-Z]+")) {
return false;
}
Cursor cursor = null;
try {
try {
cursor = sQLiteDatabase.query(Const.TableSchema.TABLE_NAME, null, null, null, null, null, null);
} catch (Exception e) {
e.printStackTrace();
if (cursor == null) {
return false;
}
cursor.close();
return false;
}
} catch (Throwable th) {
if (cursor != null) {
cursor.close();
}
throw th;
}
}
public static boolean isTableExists(String str, SQLiteDatabase sQLiteDatabase) {
try {
return BaseUtility.containsIgnoreCases(findAllTableNames(sQLiteDatabase), str);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public static boolean isColumnExists(String str, String str2, SQLiteDatabase sQLiteDatabase) {
boolean z = false;
if (TextUtils.isEmpty(str) || TextUtils.isEmpty(str2)) {
return false;
}
Cursor cursor = null;
try {
try {
cursor = sQLiteDatabase.rawQuery("pragma table_info(" + str2 + ")", null);
} catch (Exception e) {
e.printStackTrace();
}
} finally {
if (cursor != null) {
cursor.close();
}
}
}
public static List<String> findAllTableNames(SQLiteDatabase sQLiteDatabase) {
ArrayList arrayList = new ArrayList();
Cursor cursor = null;
try {
try {
cursor = sQLiteDatabase.rawQuery("select * from sqlite_master where type = ?", new String[]{"table"});
} catch (Exception e) {
e.printStackTrace();
throw new DatabaseGenerateException(e.getMessage());
}
} finally {
if (cursor != null) {
cursor.close();
}
}
}
public static TableModel findPragmaTableInfo(String str, SQLiteDatabase sQLiteDatabase) {
if (isTableExists(str, sQLiteDatabase)) {
List<String> findUniqueColumns = findUniqueColumns(str, sQLiteDatabase);
TableModel tableModel = new TableModel();
tableModel.setTableName(str);
Cursor cursor = null;
try {
try {
cursor = sQLiteDatabase.rawQuery("pragma table_info(" + str + ")", null);
} catch (Exception e) {
e.printStackTrace();
throw new DatabaseGenerateException(e.getMessage());
}
} finally {
if (cursor != null) {
cursor.close();
}
}
} else {
throw new DatabaseGenerateException(DatabaseGenerateException.TABLE_DOES_NOT_EXIST_WHEN_EXECUTING + str);
}
}
public static List<String> findUniqueColumns(String str, SQLiteDatabase sQLiteDatabase) {
Cursor cursor;
ArrayList arrayList = new ArrayList();
Cursor cursor2 = null;
try {
Cursor rawQuery = sQLiteDatabase.rawQuery("pragma index_list(" + str + ")", null);
try {
if (rawQuery.moveToFirst()) {
cursor = null;
do {
try {
if (rawQuery.getInt(rawQuery.getColumnIndexOrThrow("unique")) == 1) {
cursor = sQLiteDatabase.rawQuery("pragma index_info(" + rawQuery.getString(rawQuery.getColumnIndexOrThrow("name")) + ")", null);
if (cursor.moveToFirst()) {
arrayList.add(cursor.getString(cursor.getColumnIndexOrThrow("name")));
}
}
} catch (Exception e) {
e = e;
cursor2 = rawQuery;
try {
e.printStackTrace();
throw new DatabaseGenerateException(e.getMessage());
} catch (Throwable th) {
th = th;
if (cursor2 != null) {
cursor2.close();
}
if (cursor != null) {
cursor.close();
}
throw th;
}
} catch (Throwable th2) {
th = th2;
cursor2 = rawQuery;
if (cursor2 != null) {
}
if (cursor != null) {
}
throw th;
}
} while (rawQuery.moveToNext());
cursor2 = cursor;
}
if (rawQuery != null) {
rawQuery.close();
}
if (cursor2 != null) {
cursor2.close();
}
return arrayList;
} catch (Exception e2) {
e = e2;
cursor = null;
} catch (Throwable th3) {
th = th3;
cursor = null;
}
} catch (Exception e3) {
e = e3;
cursor = null;
} catch (Throwable th4) {
th = th4;
cursor = null;
}
}
public static boolean isFieldNameConflictWithSQLiteKeywords(String str) {
if (TextUtils.isEmpty(str)) {
return false;
}
StringBuilder sb = new StringBuilder();
sb.append(Constants.ACCEPT_TIME_SEPARATOR_SP);
sb.append(str.toLowerCase(Locale.US));
sb.append(Constants.ACCEPT_TIME_SEPARATOR_SP);
return SQLITE_KEYWORDS.contains(sb.toString());
}
public static String convertToValidColumnName(String str) {
if (!isFieldNameConflictWithSQLiteKeywords(str)) {
return str;
}
return str + KEYWORDS_COLUMN_SUFFIX;
}
public static String convertWhereClauseToColumnName(String str) {
if (!TextUtils.isEmpty(str)) {
try {
StringBuffer stringBuffer = new StringBuffer();
Matcher matcher = Pattern.compile("(\\w+\\s*(=|!=|<>|<|>)|\\w+\\s+(not\\s+)?(like|between)\\s+|\\w+\\s+(not\\s+)?(in)\\s*\\()").matcher(str);
while (matcher.find()) {
String group = matcher.group();
String replaceAll = group.replaceAll("(\\s*(=|!=|<>|<|>)|\\s+(not\\s+)?(like|between)\\s+|\\s+(not\\s+)?(in)\\s*\\()", "");
String replace = group.replace(replaceAll, "");
matcher.appendReplacement(stringBuffer, convertToValidColumnName(replaceAll) + replace);
}
matcher.appendTail(stringBuffer);
return stringBuffer.toString();
} catch (Exception e) {
e.printStackTrace();
}
}
return str;
}
public static String[] convertSelectClauseToValidNames(String[] strArr) {
if (strArr == null || strArr.length <= 0) {
return null;
}
String[] strArr2 = new String[strArr.length];
for (int i = 0; i < strArr.length; i++) {
strArr2[i] = convertToValidColumnName(strArr[i]);
}
return strArr2;
}
public static String convertOrderByClauseToValidName(String str) {
if (TextUtils.isEmpty(str)) {
return null;
}
String lowerCase = str.trim().toLowerCase(Locale.US);
if (lowerCase.contains(Constants.ACCEPT_TIME_SEPARATOR_SP)) {
String[] split = lowerCase.split(Constants.ACCEPT_TIME_SEPARATOR_SP);
StringBuilder sb = new StringBuilder();
int length = split.length;
int i = 0;
boolean z = false;
while (i < length) {
String str2 = split[i];
if (z) {
sb.append(Constants.ACCEPT_TIME_SEPARATOR_SP);
}
sb.append(convertOrderByItem(str2));
i++;
z = true;
}
return sb.toString();
}
return convertOrderByItem(lowerCase);
}
private static String convertOrderByItem(String str) {
String str2 = "";
if (str.endsWith("asc")) {
str = str.replace("asc", "").trim();
str2 = " asc";
} else if (str.endsWith("desc")) {
str = str.replace("desc", "").trim();
str2 = " desc";
}
return convertToValidColumnName(str) + str2;
}
}