2016-06-09 30 views
0

我的问题是围绕易于维护和高效的代码。更具体地说,它围绕从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中)?重新迭代,主要是为了减少维护费用/问题并考虑运行效率。

回答

0

看来,使用运行一次每活动设置列偏移值,不能在不引入塔顶得到改善。

1

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

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

要减少打字量,请编写一个辅助功能,该功能既可调用getColumnIndexOrThrow()也可调用getString()/getXxx()

+0

重新列出不同的列索引。我知道,并且在示例中,您会注意到,例如,我有AISLES_COLUMN_ID(等于_ID)和AISLES_COLUMN_ID_FULL,其中包含表名作为前缀(aisles_id)。所以这个方面是关于命名约定的,并且包含在内。 – MikeT

+0

重新检查缺失的列。这是我不这样做,因为我始终使用常量;在数据库创建,查询和访问/更新数据时(同时帮助准确地编写代码)。我其实并没有看到需要。我可能会考虑试图确定使用'getColumnIndex()'的实际开销是多少。对我来说,一定有一些,因为基本上你是通过名称搜索游标,然后提取偏移量,然后用它来访问数据。 – MikeT

+0

虽然减少打字很好,但它不是真正的对象。该对象更多是编写不易引入错误的代码,因为可能会遗漏或包含错误的重复代码。也许我最终会在整个过程中使用'cursor.getType(getColumnIndex(columnname))'并冒着开销的风险:)。或许我需要一点说服力,虽然:)。我非常感谢您的意见,我一定会考虑帮手功能。 – MikeT