Как использовать строку формата с запросом SQL по ресурсам - PullRequest
0 голосов
/ 18 октября 2019

У меня есть строковый констант внутри кода. Могу ли я положить все это в ресурсы strings.xml? Я предполагаю, что возможность раздельного использования имен столбцов останется. Необходимо искать индекс постов в будущих запросах к базе данных. Не использовать индексы, цифры запутанные, неудобные.

private static final String NAME_DB = "cars.db";
private static final String TABLE_NAME = "cars";

private static final String COL_BRAND = "brand";
private static final String COL_MODEL = "model";
private static final String COL_COLOR = "color";
private static final String COL_MAX_SPEED = "max_speed";
private static final String COL_ENGINE_POWER = "engine_power";

private static final String CREATE_TABLE =
        "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" +
                "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," +
                COL_BRAND + " TEXT NOT NULL, " +
                COL_MODEL + " TEXT NOT NULL, " +
                COL_COLOR + " TEXT, " +
                COL_MAX_SPEED + " INTEGER," +
                COL_ENGINE_POWER + " INTEGER)";


private static final String INSERT_DEFAULT_VALUES =
        "INSERT INTO " + TABLE_NAME + "(brand, model, color, max_speed, engine_power) VALUES" +
                "('Audi', 'Q7 II', 'White', 233, 252)," +
                "('Acura', 'ZDX', 'Black', 241, 300)," +
                "('BMW', 'X1 I', 'Blue', 205, 204)," +
                "('Hyundai', 'Solaris', 'Red', 100, 100)," +
                "('Hyundai', 'Tucson', 'Gray', 150, 177)," +
                "('BMW', '8 G14', 'Black', 250, 320)";

private static final String SELECT_ALL = "SELECT * FROM " + TABLE_NAME;
private static final String SELECT_TOP_1 = "SELECT * FROM " + TABLE_NAME + " LIMIT 1";

Пример кода

DatabaseAdapter(Context context) {
    db = context.openOrCreateDatabase(NAME_DB, MODE_PRIVATE, null);
    db.execSQL(CREATE_TABLE);
    Cursor cursor = db.rawQuery(SELECT_TOP_1, null);

    if (!cursor.moveToFirst()) {
        db.execSQL(INSERT_DEFAULT_VALUES);
    }
}

String[] selectAll() {
    Cursor cursor = db.rawQuery(SELECT_ALL, null);
    if (!cursor.moveToFirst()) {
        return null;
    }

    ArrayList<String> list = new ArrayList<>();
    while (cursor.moveToNext()) {
        list.add(
                cursor.getString(cursor.getColumnIndex(COL_BRAND)) + " " +
                        cursor.getString(cursor.getColumnIndex(COL_MODEL)) + " " +
                        cursor.getString(cursor.getColumnIndex(COL_COLOR)) + " " +
                        cursor.getString(cursor.getColumnIndex(COL_MAX_SPEED)) + " " +
                        cursor.getString(cursor.getColumnIndex(COL_ENGINE_POWER))
        );
    }

    return list.toArray(new String[0]);
}

1 Ответ

0 голосов
/ 18 октября 2019

Есть несколько решений с SQL в XML. Посмотрите, можете ли вы использовать один из них.

Однако ИМХО лучше централизовать код и сохранять там текст, даже без констант.

Отдельные вопросы: запрос к базе данных и полученный объект. Это можно сделать, предоставив Stream низкоуровневого объекта результирующего набора, который с помощью классов может отображаться в их собственные классы. Развязывает занятия;сохраняет слои отдельно. (Возможно, менее интересный для Android.) Используемый код становится довольно компактным, запросы выполняются в другом месте.

Мои аргументы:

  • Меньше переходов назад и вперед к различным источникам
  • Лучшая читаемость
  • Имена столбцов не меняются
  • Прописки констант менее читаемы
  • Хранение кода вместе предотвращает распространение похожих запросов без присмотра

Однако в бизнес-коде более высокого уровня все же лучше, чем SQL, изолировать SQL в XML, чтобы иметь меньший исходный код и выполнять запросы в других местах. Так что, по крайней мере, сделайте это.

Java - Хранение операторов SQL во внешнем файле

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