我需要定义大量数据以存储在应用程序中并用作查找表。例如,我有一系列制造商名称,每个名称都有一个制造商代码。每个制造商都可以制作不同的产品,每个产品都有自己的代码。
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查询会将制造商和产品代码发送到服务器,在那里它可以使用制造商和产品名称进行响应。
答案 0 :(得分:2)
您应该考虑以下事项:如果数据库随应用程序一起提供,则每次必须更新数据库时都必须为应用程序发布更新。所以问题是,您需要多久更新一次数据?如果每隔几个月或者每年只更新一次数据库是可以的,那么使用您的应用程序运送数据库可能是一种选择,如果您需要每月甚至每周更新一次,那么您一定要主持网络上的某个数据库;在如此短的时间间隔内发布更新不是一个可行的选择。
您应该考虑的另一件事:如果数据库仅作为Web服务存在,并且每个查找都需要对服务器进行JSON调用,那么如果用户处于脱机状态(目前已有),则无法执行查找无论出于何种原因无法访问网络)。此外,每次查找都会花费用户流量,因此如果用户有月度限制,但需要每天执行大量查找,那么使用您的应用可能很快会导致他超过每月限制,从而使他无需任何Internet服务(或非常最后扼杀了一个。
根据我的经验,最好在线托管这样的数据库,如果可能的话,将其缓存以供离线访问。该应用程序本身附带了一个数据库副本,该副本在您构建应用程序以进行分发时是最新的。每次应用程序启动时,也许每天一次,以防应用程序永不退出,它将向Web服务器查询当前的版本"的数据库。如果此版本比应用程序附带的版本更新,它会尝试将此数据库的副本下载到其本地缓存,然后切换到缓存副本以供将来查找。如果缓存的副本丢失(系统可能随时刷新缓存),则必须重新下载。与此同时,它可以使用已发布的数据库,该数据库已过时,但总比没有好。如果无法下载(例如,设备上没有足够的可用空间),应用程序可能希望在用户当前在线时直接进行在线查询,如果他处于脱机状态则回退到已过时的已发送数据库,并重试稍后下载缓存副本(当时设备可能有更多可用空间)。
所以基本上你的应用程序的工作流程如下:
如果您将来只向数据库添加更多条目,但现有条目永远不会改变,还有另一个甚至更好的选择:您只有两个数据库。应用程序附带的应用程序和仅包含最后一个应用程序发布后的更新(添加新条目)的应用程序。这会缩小需要下载和缓存的数据量。在这种情况下,您的应用程序必须始终执行两次查找,一次在已发送的数据库中(始终先执行),如果没有找到,则在下载的缓存副本中,该副本不包含已在发布的数据库中找到的条目(或者直接在线,如果没有可用的缓存副本,但用户当前可以访问Internet)。每次发布应用程序的新更新时,它都会获得数据库的新完整副本,因此您可以将更新数据库重置为零条目,并且只在那里添加新条目(或者您可以保留不同的更新数据库)在服务器上为不同的应用程序版本提供了不同的数据库,如果你不认为管理太麻烦了。
下载的更新数据库甚至可以由服务器动态创建,这当然是最好的选择。例如。在发布应用程序之后,您将3个供应商和30个产品添加到数据库中,并且每个供应商和产品都有一个唯一的ID(随着每个新条目的添加而严格增加),然后应用程序可以告诉服务器它知道的最高供应商ID为X,最高产品为ID Y,在这种情况下,服务器会发送一个更新数据库,其中包含ID高于X和Y的所有供应商和产品。
所有这些决定都会影响要使用的数据库格式。通常它听起来很像CoreData的工作,但如果你想要动态更新数据库,更新应该以不同的格式(JSON,XML,CVS或服务器可以轻松生成的其他东西)提供,并通过以下方式转换为CoreData:下载完成后的应用程序,因为在服务器上动态生成CoreData数据库相当困难,绝对不推荐。