My Activity предполагает выполнение запросов к базе данных приложения, которые пользователь вводит в поле editText. Что у меня сейчас:
@Override
public void onClick(View v) {
if (v.getId() == R.id.sql_viewer_query) {
if (tvError.isShown()) {
tvError.setVisibility(View.GONE);
}
String query = etQuery.getText().toString();
String tableCheckedQuery = SQLValidator.isTableAndColumnExist(query);
if (tableCheckedQuery.equals(SQLValidator.NO_COLUMN) || tableCheckedQuery.equals(SQLValidator.NO_TABLE)) {
toast(tableCheckedQuery, false);
return;
}
Database database = AutoRunReceiver.getDaoSession().getDatabase();
try {
Cursor cursor = database.rawQuery(tableCheckedQuery, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
int columnCount = cursor.getColumnCount();
ArrayList<String> list = new ArrayList<>();
int x = 0;
do {
StringBuilder s = new StringBuilder();
for (int i = 0; i < columnCount; i++) {
String o = SQLFieldTypeChecker.getType(cursor, i);
if (o.isEmpty()) {
continue;
}
s.append(cursor.getColumnName(i)).append(": ").append(o).append("\n");
}
String g = s.toString().substring(0, s.length() - 1);
list.add(g);
x++;
} while (cursor.moveToNext() && x < MAX_RECYCLER_VIEW_LENGTH);
mRecyclerView.setAdapter(new QueryResultAdapter(this, list));
} else {
toast("Empty", true);
}
}
} catch (SQLiteException e) {
e.printStackTrace();
toast(e, true);
}
}
}
Класс SQLValidator:
public class SQLValidator {
public final static String NO_TABLE = "NO SUCH TABLE";
public final static String NO_COLUMN = "NO COLUMNS SELECTED";
public static String isTableAndColumnExist(String query) {
AbstractDao<?, ?>[] abstractDao = AutoRunReceiver.getDaoSession().getAllDaos().toArray(new AbstractDao[0]);
boolean has = false;
boolean hasColumn = false;
String[] check = query.split("from");
if (check[0].contains("*")) {
hasColumn = true;
}
for (AbstractDao<?, ?> dao : abstractDao) {
if (Pattern.compile(Pattern.quote(dao.getTablename()), Pattern.CASE_INSENSITIVE).matcher(query).find()) {
has = true;
Property[] properties = dao.getProperties();
for (Property property : properties) {
if (Pattern.compile(Pattern.quote(property.name), Pattern.CASE_INSENSITIVE).matcher(query).find()) {
String regex = "(?i)" + property.name;
query = query.replaceAll(regex, property.columnName);
}
if (Pattern.compile(Pattern.quote(property.columnName), Pattern.CASE_INSENSITIVE).matcher(query).find()) {
hasColumn = true;
}
}
}
}
if (!has) {
return NO_TABLE;
}
if (!hasColumn) {
return NO_COLUMN;
}
return query;
}
На самом деле я уже много пробовал и удалил в этом классе за 2 дня, но не сделал то, что мне нужно.
МОЙ ВОПРОС: Есть ли какое-либо решение, библиотека, учебник для проверки sql запроса, поступающего из текста редактирования?