我能否在不过度影响效率或引入开销的情况下减少代码重复?

Can I reduce code duplication, without unduly compromising efficieny or introducing overheads?

我的问题集中在拥有易于维护且高效的代码上。更具体地说,它围绕从 SQLite 游标获取数据。

当我第一次开始使用游标时,我会按照 mystrvar = cursor.getString(?) 的方式硬编码一些内容,其中 ? 将是相应行的偏移量。

然后我开始使用与 table 列名称一起定义的常量。例如我会有类似的东西:-

// Table Aisles
    public static final String AISLES_TABLE_NAME = "aisles";
    public static final String AISLES_COLUMN_ID = PRIMARY_KEY_NAME;
    public static final String AISLES_COLUMN_ID_FULL = AISLES_TABLE_NAME + AISLES_COLUMN_ID;
    public static final int AISLES_COLUMN_ID_INDEX = 0; ........

并且,例如,将按照以下方式编写代码:-

mystrvar = cursor.getString(DBHelper.AISLES_COLUMN_ID_INDEX);

这是一个改进,但有一个缺陷,即不能很好地处理加入的 tables。

然后我开始意识到 cursor.getColumnIndex(),但怀疑仅使用它。会有可以避免的开销。

我所做的是包含很少使用 getColumnIndex() 的代码。它通过 getColumnIndex() 在 activity/custom 游标适配器中仅设置一次 offset 变量,随后使用相应的 offset 变量,它是相应列的游标偏移量。

下面是一个示例(分为 3 个块,变量定义,第二个是设置变量的方法,第三个是从游标中提取实际数据:-

1) 变量定义:-

public class Database_Inspector_AislesDB_Adapter extends CursorAdapter {

    // Variables to store aisles table offsets as obtained via the defined column names by
    // call to setAislesOffsets (aisles_aisleid_offset set -1 to act as notdone flag )
    public static int aisles_aisleid_offset = -1;
    public static int aisles_aislename_offset;
    public static int aisles_aisleorder_offset;
    public static int aisles_aisleshopref_offset;

    public Database_Inspector_AislesDB_Adapter(Context context, Cursor cursor, int flags) {
        super(context, cursor, 0);
        setAislesOffsets(cursor); //** Calls method to set offsets
    ........ 
}

2) 仅设置一次偏移量的方法(returns 如果已经设置,几乎立即)

    // Set Aisles Table query offsets into returned cursor, if not already set
    public void setAislesOffsets(Cursor cursor) {
        if(aisles_aisleid_offset != -1) {
            return;
        }
        aisles_aisleid_offset = cursor.getColumnIndex(ShopperDBHelper.AISLES_COLUMN_ID);
        aisles_aislename_offset = cursor.getColumnIndex(ShopperDBHelper.AISLES_COLUMN_NAME);
        aisles_aisleorder_offset = cursor.getColumnIndex(ShopperDBHelper.AISLES_COLUMN_ORDER);
        aisles_aisleshopref_offset = cursor.getColumnIndex(ShopperDBHelper.AISLES_COLUMN_SHOP);
    }

3) 偏移量的使用示例

        textviewaisleid.setText(cursor.getString(aisles_aisleid_offset));
        textviewaislesaislename.setText(cursor.getString(aisles_aislename_offset));
        textviewaislesorder.setText(cursor.getString(aisles_aisleorder_offset));
        textviewaisleshopref.setText(cursor.getString(aisles_aisleshopref_offset));

然而,上述编码必须用于每个使用 table table 的 activity/adapter。有 7 个 table 有 56 列。加入tables需要组合。有没有一种方法可以使用等效的全局变量(我假设使用共享首选项会产生更多开销)。那就是我可以从任何地方只设置一次偏移量,然后从任何地方访问它们(通过任何地方我的意思是从任何 activity 或 adpater 内)?再次重申,主要是减少维护overheads/issues,兼顾运行效率

每个查询可以有不同的列索引,因此使用 table 列索引不是一个好主意。

getColumnIndex() 没有性能问题,尤其是当您只返回一行时。 (但为了避免对缺失或错误的列进行额外检查,您应该尽可能使用 getColumnIndexOrThrow()。)

为了减少打字量,写一个调用getColumnIndexOrThrow()getString()/getXxx()的辅助函数。

似乎每个 activity 使用一次 运行 来设置列偏移值,不能在不引入开销的情况下进行了改进。