2016-06-09 28 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