我是否可以减少代码重复,而不会过度降低效率或引入开销?

时间:2016-06-09 11:18:52

标签: java sqlite android-cursor

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

当我第一次开始使用游标时,我会在mystrvar = cursor.getString(?)的行中编写一些代码,其中将是相应行的偏移量。

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

// 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);

这是一个改进,但有一个不善于应对联合表的缺陷。

然后我意识到cursor.getColumnIndex(),但怀疑只使用这个。会有可能被规避的管理费用。

我所做的是包含稀疏使用getColumnIndex()的代码。它只在活动/自定义游标适配器中通过getColumnIndex()设置 偏移 变量,然后使用相应的 偏移量 < / strong>变量,它是相应列的光标偏移量。

以下是一个示例(分为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)只设置一次偏移的方法(如果已经设置,则几乎立即返回)

    // 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));

但是,必须对使用表表的每个活动/适配器使用上述编码。有7个表,56列。连接表需要组合。有没有办法可以使用等价的全局变量(我假设使用共享首选项会更多的是开销)。那就是我可以从任何地方设置一次偏移,然后从任何地方访问它们(我指的是任何活动或adpater中的任何地方)?重新迭代,主要是为了减少维护开销/问题并考虑运行效率。

2 个答案:

答案 0 :(得分:1)

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

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

要减少输入的数量,请编写一个调用getColumnIndexOrThrow()getString() / getXxx()的辅助函数。

答案 1 :(得分:0)

使用 每个活动运行一次 来设置列偏移值似乎无法在不引入开销的情况下进行改进。