Как получить имена столбцов / полей в OrmLite?
Я определяю имена таблиц / полей с помощью обычных аннотаций, например:
@DatabaseTable(tableName = "M")
public class Headers {
//android requires primary key as _ID
@DatabaseField(generatedId = true, columnName = "_ID", dataType = DataType.INTEGER_OBJ)
private Integer id;
@DatabaseField(
columnName = "MM2",
uniqueCombo = true,
canBeNull = true, //null means root folder
dataType = DataType.INTEGER_OBJ
)
private Integer parentId;
}
Между тем где-то глубоко в моем коде мне нужно сделать несколько запросов, например:
QueryBuilder<Headers, Integer> qb = headersDao.queryBuilder();
qb.where().eq("_ID", headerId); //_ID field name
Этот вид кода выглядит некрасиво, так как имя поля (в данном случае _ID
) жестко закодирован (даже если будет объявлен как final static String
)
Вопрос: это нормальная практика кодирования OrmLite? Я бы ожидал, что я мог бы использовать вместо жестко _ID
поле небольшой код. OrmLite наверняка "знает" все имена полей. Кто-нибудь может мне помочь?
1 ответ
Решение
Определите константу для имени поля, например
private static final String FIELD_ID = "_ID";
// Or make it public as Gray said into comment
public static final String FIELD_ID = "_ID";
и использовать его как
//android requires primary key as _ID
@DatabaseField(generatedId = true, columnName = FIELD_ID, dataType = DataType.INTEGER_OBJ)
private Integer id;
И в ваш запрос
QueryBuilder<Headers, Integer> qb = headersDao.queryBuilder();
qb.where().eq(FIELD_ID, headerId); //_ID field name
Если вы посмотрите на документацию
Они также следуют тому же
QueryBuilder<Account, String> qb = accountDao.queryBuilder();
Where where = qb.where();
// the name field must be equal to "foo"
where.eq(Account.NAME_FIELD_NAME, "foo");
// and
where.and();
// the password field must be equal to "_secret"
where.eq(Account.PASSWORD_FIELD_NAME, "_secret");
PreparedQuery<Account, String> preparedQuery = qb.prepareQuery();