Прямо сейчас у меня есть код, похожий на этот:
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
, и это сократило бы мой код, но отсутствие документации заставляет его чувствовать себя не так.
Нет, вам определенно не нужно записывать значения индекса столбца в ваш код. Если вы это сделаете, вашей базе данных будет практически невозможно управлять (поскольку внесение изменений в таблицу может привести к изменению значений индекса).
Из того, что я могу сказать, ваш код трудно читать, потому что:
Вы лихрируете свой код с ненужными вызовами toString()
. Просто избавься от них... они полностью избыточны.
Вы слишком сильно используете final
ключевое слово и его загромождаете свой код. Это следует использовать в качестве меры предосторожности в ситуациях, когда вы можете случайно изменить значение переменной. Это не одна из таких ситуаций...
Вы распространяете простые утверждения по нескольким строкам. Просто используйте одну строку, и это упростит чтение.
Тем не менее, технически нет ничего плохого в любой из вышеупомянутых методов кодирования. Я просто говорю: если вы действительно заботитесь о том, чтобы ваш код был легко читаемым, вы можете рассмотреть их как предложения.
If you do, making changes to your database will be nearly impossible to manage.
-- Потому что...
getColumnIndex()
иgetColumnIndexOrThrow()
дольше печатать, но безопаснее, если вы когда-нибудь измените порядок или создадите незначительные изменения в вашем запросе.