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,这会缩短我的代码,但是缺少文档会让人感觉不对。

4

1 回答 1

3

不,您绝对不应该列索引值硬编码到您的代码中。如果这样做,您的数据库将几乎无法管理(因为对表进行更改可能会导致索引值发生更改)。

据我所知,您的代码很难阅读,因为:

  1. 您正在通过对toString(). 摆脱它们……它们完全是多余的。

  2. 您使用的final关键字方式太多,它会使您的代码变得混乱。在您可能意外更改变量值的情况下,这应该用作预防措施。这不是那些情况之一......

  3. 您正在跨多行传播简单的陈述。只需使用一行,它就会更容易阅读。

也就是说,上述任何编码实践在技术上都没有问题。我只是说,如果您真的关心使您的代码易于阅读,那么您可能希望将它们视为建议。

于 2012-06-24T00:50:23.403 回答