2013-01-09 77 views
1

我需要定義大量的數據存儲在應用程序中並用作查找表。例如,我有一組製造商名稱,每個名稱都有一個mfg代碼。每個製造商都可以生產不同的產品,每個產品也都有自己的代碼。多維查找表

A,7可能被破譯的意思

Manufacturer: Apple(A) 
Product: MacMini(7) 

我看到這個定義的幾種方法,但我不知道這將是最好的。

項1)#定義在一個單獨的頭文件這些常數,例如:

#define MFG_APPLE @"A" 
#define MFG_DELL @"B" 

#define PRODUCT_MAC_MINI 7 
#define PRODUCT_INSPIRON 2 

選項2)創建填充有字典對象,讓我通過索引它們更容易字典對象。

選項3)使用核心數據創建這些mfgs和產品及關係的數據庫。

如果建議使用選項2或3,是否有簡單的方法預先填充這些數據結構,而不是在程序啓動時對它們進行硬編碼以填充它們?

選項4)創建一個Web服務,將其綁定到服務器,在該服務器上可以更頻繁地更新數據。 JSON查詢會將製造商和產品代碼發送到服務器,在那裏它可以用製造商和產品名稱進行響應。

+1

選項4 ........ –

+1

如有疑問......請在服務器上執行此操作,尤其是移動設備。這很可能是最快實施的,並且在設備上做的越少=更好 – RyanG

+0

另一種選擇:讓應用程序在需要時從服務器更新其數據庫。這是最佳的解決方案恕我直言,因爲它意味着更新可以完成時,用戶可以訪問互聯網和您的應用程序可以使用時,她不。 – trojanfoe

回答

2

您應該考慮以下幾點:如果數據庫隨應用程序一起提供,則每次必須更新數據庫時都必須爲應用程序發佈更新。所以問題是,您需要多久更新一次數據?如果每隔幾個月更新一次數據庫或者每年更新一次數據庫就可以了,如果您需要每月甚至每週更新一次數據庫,則可以選擇將數據庫與您的應用程序一起發送,但您應該將數據庫託管在某處網絡;在如此短的時間間隔內發佈更新並不是一個可行的選擇。

您應該考慮的另一件事是:如果數據庫僅作爲Web服務存在,並且每次查找都需要對服務器執行JSON調用,則如果用戶處於脫機狀態(當前沒有無論出於何種原因的網絡訪問)同樣,每次查找都會花費用戶流量,因此如果用戶每月都有限制,但每天需要執行大量查詢,則使用您的應用可能會很快導致超出該月度限制,導致他無需任何Internet服務(或非常最後扼殺一個)。

根據我的經驗,最好在線託管這樣的數據庫,但如果可能的話,將其緩存爲脫機訪問。該應用程序本身附帶一份數據庫副本,該副本在您構建應用程序以供分發的當天即爲最新版本。每次應用程序啓動時,如果應用程序永遠不會退出,可能每天一次,它將向Web服務器查詢當前數據庫的「版本」。如果此版本比隨應用程序提供的版本更新,它會嘗試將此數據庫的副本下載到本地緩存,然後切換到緩存副本以供將來查找。如果緩存副本丟失(緩存可能隨時被系統刷新),則必須重新下載。與此同時,它可以使用發貨的數據庫,這是過時的,但總比沒有好。如果無法下載(例如,設備上沒有足夠的可用空間),則應用程序可能希望在用戶當前在線的情況下直接進行在線查詢,如果他脫機則回退到過期的已發貨數據庫,然後重試在稍後的時間下載緩存副本(也許該設備當時將具有更多可用空間)。

所以基本上你的應用程序將有一個工作流程如下:

  1. START
  2. 一個本地緩存的副本存在?如果否轉到6.
  3. 本地緩存副本是否是最新的?如果否轉到5.
  4. 使用本地緩存副本執行查找。轉到12.
  5. 刪除過期的緩存副本。轉到1.
  6. 發貨的數據庫是最新的?如果不是Goto 8.
  7. 使用發貨的數據庫執行查找。轉到12.
  8. 下載更新的數據庫。
  9. 下載成功了嗎?如果是轉到4.
  10. 該用戶目前在線?如果否轉到7.
  11. 使用JSON Web服務執行查找。轉到12
  12. END

如果你只在未來增加更多的條目到數據庫中,但現有的條目永遠不會改變,也有另一種,甚至是更好的選擇:你只需兩個數據庫。一個與應用程序一起發佈,另一個僅包含上次應用程序發佈後的更新(添加了新條目)。這大大縮小了需要大量下載和緩存的數據量。在這種情況下,您的應用必須始終執行兩個查找,一個在發貨數據庫中(始終首先執行),如果沒有發現任何內容,請在下載的緩存副本中找到,該副本不包含已發貨數據庫中已找到的條目或直接在線,如果沒有緩存副本可用,但用戶當前可以訪問Internet)。每次發佈應用程序的新更新時,它都會得到一個新的數據庫完整副本,因此您可以將更新數據庫重置爲零條目,並且只需在其中添加新條目(或者可以將不同的更新數據庫放在周圍在服務器上爲不同的應用程序版本提供不同的數據庫,如果您認爲管理不太麻煩)。

下載的更新數據庫甚至可以由服務器動態創建,這當然是最好的選擇。例如。在發佈應用程序之後,您將3個供應商和30個產品添加到數據庫,並且每個供應商和產品都有一個唯一的ID(隨着每個新條目的添加,這個ID將嚴格增加),那麼應用程序可以告訴服務器它知道的最高供應商具有ID X並且最高產品具有ID Y,在這種情況下,服務器發送具有高於X和Y的所有供應商和產品的更新數據庫。

所有這些決定都影響要使用的數據庫格式。一般來說,它聽起來很像CoreData的工作,但如果你想要動態更新數據庫,更新應該以不同的格式(JSON,XML,CVS或其他服務器可以輕鬆生成的)傳遞並由CoreData轉換爲CoreData下載完成後的應用程序,因爲動態生成服務器上的CoreData數據庫是相當困難,絕對不建議。