Android SQLite: является ли хорошей практикой вызывать getColumnIndex при извлечении значений из таблицы?

1

Прямо сейчас у меня есть код, похожий на этот:

SqlTables.java:

// Separate file
public enum SqlTables {
    TABLE_1("table_1"),
    .
    .
    .
    TABLE_N("table_n");
    final String name;
    private SqlTables(String name) {
        this.name = name;
    }
}

Table1Columns.java:

// Separate file
public enum Table1Columns {
    ...
}

SqlDatabaseInterface.java:

Cursor c = db.query(SqlTables.TABLE_1.toString(), null...);
final int indexId = c.getColumnIndexOrThrow(
        Table1Columns.ID.toString());
final int indexName = c.getColumnIndexOrThrow(
        Table1Columns.NAME.toString());
while (c.moveToNext()) {
    final String id = c.getString(indexId);
    final String name = c.getString(indexName);
}

Я не нашел никакой документации относительно того, как Android сопоставил столбцы с индексами, поэтому, пока я подтвердил, что он основан на порядке, в котором столбцы были указаны в запросе, у меня нет гарантии, что это будет работать на 100% времени, или что будущие обновления будут поддерживать это поведение. Преимущества использования getColumnIndexOrThrow(...) - это гарантия того, что мои индексы всегда будут правильными, если столбцы, на которые они ссылаются, включены в запрос. Недостатком является то, что, помимо скуки, это делает мой код намного сложнее читать и значительно увеличивает длину моих методов. С другой стороны, я мог просто указать индексы, не вызывая getColumnsIndexOrThrow, и это сократило бы мой код, но отсутствие документации заставляет его чувствовать себя не так.

  • 2
    Я думаю, у вас есть общая идея. Использование getColumnIndex() и getColumnIndexOrThrow() дольше печатать, но безопаснее, если вы когда-нибудь измените порядок или создадите незначительные изменения в вашем запросе.
Теги:
android-sqlite
android-cursor

1 ответ

3
Лучший ответ

Нет, вам определенно не нужно записывать значения индекса столбца в ваш код. Если вы это сделаете, вашей базе данных будет практически невозможно управлять (поскольку внесение изменений в таблицу может привести к изменению значений индекса).

Из того, что я могу сказать, ваш код трудно читать, потому что:

  1. Вы лихрируете свой код с ненужными вызовами toString(). Просто избавься от них... они полностью избыточны.

  2. Вы слишком сильно используете final ключевое слово и его загромождаете свой код. Это следует использовать в качестве меры предосторожности в ситуациях, когда вы можете случайно изменить значение переменной. Это не одна из таких ситуаций...

  3. Вы распространяете простые утверждения по нескольким строкам. Просто используйте одну строку, и это упростит чтение.

Тем не менее, технически нет ничего плохого в любой из вышеупомянутых методов кодирования. Я просто говорю: если вы действительно заботитесь о том, чтобы ваш код был легко читаемым, вы можете рассмотреть их как предложения.

  • 0
    If you do, making changes to your database will be nearly impossible to manage. -- Потому что...
  • 0
    Потому что, если он когда-либо изменил свою схему базы данных (то есть, добавив столбец в одну из своих таблиц), нет гарантии, что целочисленные значения останутся прежними. Такая неуловимая ошибка может стоить ему много времени на отладку. Вот почему очень, очень хорошая практика проверять целочисленные значения индекса столбца во время выполнения во время выполнения программы.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню