Android проверка запроса к базе данных - PullRequest
0 голосов
/ 18 июня 2020

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 запроса, поступающего из текста редактирования?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...