我的问题是围绕易于维护和高效的代码。更具体地说,它围绕从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列。加入的表格需要组合。有没有一种方法可以使用相当于全局变量的值(我假设使用共享偏好会带来更多的开销)。那就是我可以从任何地方设置偏移一次,然后从任何地方访问它们(在任何地方,我的意思是从任何活动或Adpater中)?重新迭代,主要是为了减少维护费用/问题并考虑运行效率。
重新列出不同的列索引。我知道,并且在示例中,您会注意到,例如,我有AISLES_COLUMN_ID(等于_ID)和AISLES_COLUMN_ID_FULL,其中包含表名作为前缀(aisles_id)。所以这个方面是关于命名约定的,并且包含在内。 – MikeT
重新检查缺失的列。这是我不这样做,因为我始终使用常量;在数据库创建,查询和访问/更新数据时(同时帮助准确地编写代码)。我其实并没有看到需要。我可能会考虑试图确定使用'getColumnIndex()'的实际开销是多少。对我来说,一定有一些,因为基本上你是通过名称搜索游标,然后提取偏移量,然后用它来访问数据。 – MikeT
虽然减少打字很好,但它不是真正的对象。该对象更多是编写不易引入错误的代码,因为可能会遗漏或包含错误的重复代码。也许我最终会在整个过程中使用'cursor.getType(getColumnIndex(columnname))'并冒着开销的风险:)。或许我需要一点说服力,虽然:)。我非常感谢您的意见,我一定会考虑帮手功能。 – MikeT