多维查找表

时间:2013-01-09 14:29:40

标签: ios objective-c lookup

我需要定义大量数据以存储在应用程序中并用作查找表。例如,我有一系列制造商名称,每个名称都有一个制造商代码。每个制造商都可以制作不同的产品,每个产品都有自己的代码。

A,7可以被解读为

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

我看到了几种定义方法,但我不确定哪种方式最好。

选项1)#define这些常量在一个单独的头文件中,例如:

#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 个答案:

答案 0 :(得分:2)

您应该考虑以下事项:如果数据库随应用程序一起提供,则每次必须更新数据库时都必须为应用程序发布更新。所以问题是,您需要多久更新一次数据?如果每隔几个月或者每年只更新一次数据库是可以的,那么使用您的应用程序运送数据库可能是一种选择,如果您需要每月甚至每周更新一次,那么您一定要主持网络上的某个数据库;在如此短的时间间隔内发布更新不是一个可行的选择。

您应该考虑的另一件事:如果数据库仅作为Web服务存在,并且每个查找都需要对服务器进行JSON调用,那么如果用户处于脱机状态(目前已有),则无法执行查找无论出于何种原因无法访问网络)。此外,每次查找都会花费用户流量,因此如果用户有月度限制,但需要每天执行大量查找,那么使用您的应用可能很快会导致他超过每月限制,从而使他无需任何Internet服务(或非常最后扼杀了一个。

根据我的经验,最好在线托管这样的数据库,如果可能的话,将其缓存以供离线访问。该应用程序本身附带了一个数据库副本,该副本在您构建应用程序以进行分发时是最新的。每次应用程序启动时,也许每天一次,以防应用程序永不退出,它将向Web服务器查询当前的版本"的数据库。如果此版本比应用程序附带的版本更新,它会尝试将此数据库的副本下载到其本地缓存,然后切换到缓存副本以供将来查找。如果缓存的副本丢失(系统可能随时刷新缓存),则必须重新下载。与此同时,它可以使用已发布的数据库,该数据库已过时,但总比没有好。如果无法下载(例如,设备上没有足够的可用空间),应用程序可能希望在用户当前在线时直接进行在线查询,如果他处于脱机状态则回退到已过时的已发送数据库,并重试稍后下载缓存副本(当时设备可能有更多可用空间)。

所以基本上你的应用程序的工作流程如下:

  1. START
  2. 是否存在本地缓存的副本?如果没有转到6。
  3. 本地缓存的副本是最新的?如果没有转到5。
  4. 使用本地缓存副本执行查找。转到12。
  5. 删除过期的缓存副本。转到1。
  6. 发货的数据库是最新的?如果没有转到8。
  7. 使用随附的数据库执行查找。转到12。
  8. 下载更新的数据库。
  9. 下载成功了吗?如果是转到4。
  10. 该用户目前在线?如果没有转到7。
  11. 使用JSON Web服务执行查找。转到12。
  12. END
  13. 如果您将来只向数据库添加更多条目,但现有条目永远不会改变,还有另一个甚至更好的选择:您只有两个数据库。应用程序附带的应用程序和仅包含最后一个应用程序发布后的更新(添加新条目)的应用程序。这会缩小需要下载和缓存的数据量。在这种情况下,您的应用程序必须始终执行两次查找,一次在已发送的数据库中(始终先执行),如果没有找到,则在下载的缓存副本中,该副本不包含已在发布的数据库中找到的条目(或者直接在线,如果没有可用的缓存副本,但用户当前可以访问Internet)。每次发布应用程序的新更新时,它都会获得数据库的新完整副本,因此您可以将更新数据库重置为零条目,并且只在那里添加新条目(或者您可以保留不同的更新数据库)在服务器上为不同的应用程序版本提供了不同的数据库,如果你不认为管理太麻烦了。

    下载的更新数据库甚至可以由服务器动态创建,这当然是最好的选择。例如。在发布应用程序之后,您将3个供应商和30个产品添加到数据库中,并且每个供应商和产品都有一个唯一的ID(随着每个新条目的添加而严格增加),然后应用程序可以告诉服务器它知道的最高供应商ID为X,最高产品为ID Y,在这种情况下,服务器会发送一个更新数据库,其中包含ID高于X和Y的所有供应商和产品。

    所有这些决定都会影响要使用的数据库格式。通常它听起来很像CoreData的工作,但如果你想要动态更新数据库,更新应该以不同的格式(JSON,XML,CVS或服务器可以轻松生成的其他东西)提供,并通过以下方式转换为CoreData:下载完成后的应用程序,因为在服务器上动态生成CoreData数据库相当困难,绝对不推荐。