我可以在不过度降低效率或引入开销的情况下减少代码重复吗



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

当我第一次开始使用游标时,我会按照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()设置一次变量,然后使用相应的偏移变量(该变量是相应列的光标偏移)。

以下是一个示例(分为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列。联接的表需要组合。有没有一种方法可以使用等效的全局变量(我假设使用共享偏好会增加开销)。也就是说,我可以从任何地方只设置一次偏移,然后从任何地方访问它们(我指的是从任何活动或adpader中的任何地方)?重新迭代,主要是为了减少维护开销/问题,并考虑运行效率。

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

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

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

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

相关内容

最新更新