我的問題是圍繞易於維護和高效的代碼。更具體地說,它圍繞從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