我们正在开始在iPhone Enterprise开发人员计划中开发内部应用程序.由于它接近OS 3.0,我们正在重新考虑使用SQLite和使用Core Data的原始设计.这里有更多信息:
有一个传统的桌面应用程序正在取代.我们将重用现有的后端.
我们目前有一个SQLite数据库作为概念证明生成.这基本上是现有后端数据库的缩减版本.
我们将从远程站点加载数据并将其存储在本地,它将持续存在并且需要存在.我们只会在它发生变化时更新它,这将是每个月或两个月.我们很可能会使用XML或JSON来传输数据.
这个项目有两个开发人员,我们都有很强的SQL技能,但没有人使用过Core Data.
我的问题是:什么是核心数据的SQLite上的利益,将利益在这个特定实例什么和做什么好处证明学习一个新的框架,而不是使用现有的SQL较强的技能?
编辑:我刚刚注意到这个问题:核心数据与SQLite 3.我想我的问题是:
如果我必须检查某个特定项是否存在或是否有更新,这很容易使用SQL,那么Core Data是否仍然有意义?我可以在图表中加载第一个对象并检查版本号而不加载整个图表吗?
如果我们已经知道SQL,那么这个项目的核心数据的优势是否证明我们能够学习它?
Barry Wark.. 19
正如您已经阅读过Core Data vs SQLite 3,您知道Core Data和持久性机制(在本例中为SQLite)基本上是正交的.核心数据实际上是关于管理对象图,它的主要用例是MVC架构的模型组件.如果您的应用程序非常适合这种架构,那么使用Core Data可能是值得的,因为它可以在模型组件中节省大量代码.如果您已经有一个工作模型组件(例如来自现有的桌面应用程序),那么Core Data将不会为您带来太多帮助.可以采用混合方法 - 您可以执行自己的持久性/查询,并在内存存储中构建核心数据,并使用查询结果填充该数据,并通过Core Data将此内存存储作为应用程序的模型组件.这并不常见,但我已经做到了,并没有重大的障碍.
回答您的具体问题:
您可以为整个持久性存储分配版本号,并通过它来检索该信息+[NSPersistentStore metadataForPersistentStoreWithURL:error:]
,甚至无需打开存储.+setMetadata:forPersistentStoreWithURL:error
当然也存在等同物.如果要将版本信息存储在实体实例中而不是存储在持久性存储元数据中,则只能加载单个对象.使用SQLite持久性存储,Core Data可以很好地获取您需要的内容.
这个NSPredicate
API非常容易学习,它似乎可以很好地编译到SQL.至少对于你可以放在iPhone上的大小的数据库来说,根据我的经验,这肯定是足够的(性能明智).不过,我认为SQL与核心数据问题有些误导.获得查询结果后,您将使用它做什么?如果您自己滚动,则必须实例化对象,处理错误/唯一(如果您不想立即将查询的整个结果加载到内存中)以及Core已提供的所有其他对象图管理工具数据.
mmc.. 7
听起来您已经使用SQLite设计了项目,并且您在该领域拥有丰富的经验.
所以最重要的是,移植这个项目是否有意义,Core Data会给我一些我原来设计中没有的东西吗?
假设原始设计已正确完成,根据对该项目的要求,可能不值得.
但这不是讨论的结束.还有其他事情需要考虑:我的下一个项目是否会有如此轻松的数据库要求?由于时间表或预算限制,我是否需要尽快发货?假设我迟早要学习核心数据,现在就这样做有意义吗?我可能有兴趣将代码移植到Mac上吗?
这些问题的答案可能会导致您做出的决定是,确实值得回到绘图板,以及了解Core Data的全部内容.
为了得出你的最后一个问题:有什么好处?好吧,Core Data是数据库的更高级抽象,它也是数据存储不可知的(所以如果iPhone的未来版本要抛弃SQLite的嵌入式MySQL版本......不太可能,但它就是一个例子)然后Core数据需要对代码进行非常少的更改才能使其与新数据存储一起使用.Core Data将为Mac平台提供大量快速便携性.Core Data将处理您的数据模型的版本控制,而除非您有一个框架或工作流来管理它,否则不会直接访问SQLite.
我敢肯定其他的回答者可以提出其他优势,也许还有一些很好的理由可以解释为什么不捣乱核心数据.顺便说一句,在类似的情况下,我的决定是移植到更高级别,更新的框架.但在我的情况下,这是一个侧面项目,发货日期和预算是非因素.
正如您已经阅读过Core Data vs SQLite 3,您知道Core Data和持久性机制(在本例中为SQLite)基本上是正交的.核心数据实际上是关于管理对象图,它的主要用例是MVC架构的模型组件.如果您的应用程序非常适合这种架构,那么使用Core Data可能是值得的,因为它可以在模型组件中节省大量代码.如果您已经有一个工作模型组件(例如来自现有的桌面应用程序),那么Core Data将不会为您带来太多帮助.可以采用混合方法 - 您可以执行自己的持久性/查询,并在内存存储中构建核心数据,并使用查询结果填充该数据,并通过Core Data将此内存存储作为应用程序的模型组件.这并不常见,但我已经做到了,并没有重大的障碍.
回答您的具体问题:
您可以为整个持久性存储分配版本号,并通过它来检索该信息+[NSPersistentStore metadataForPersistentStoreWithURL:error:]
,甚至无需打开存储.+setMetadata:forPersistentStoreWithURL:error
当然也存在等同物.如果要将版本信息存储在实体实例中而不是存储在持久性存储元数据中,则只能加载单个对象.使用SQLite持久性存储,Core Data可以很好地获取您需要的内容.
这个NSPredicate
API非常容易学习,它似乎可以很好地编译到SQL.至少对于你可以放在iPhone上的大小的数据库来说,根据我的经验,这肯定是足够的(性能明智).不过,我认为SQL与核心数据问题有些误导.获得查询结果后,您将使用它做什么?如果您自己滚动,则必须实例化对象,处理错误/唯一(如果您不想立即将查询的整个结果加载到内存中)以及Core已提供的所有其他对象图管理工具数据.
听起来您已经使用SQLite设计了项目,并且您在该领域拥有丰富的经验.
所以最重要的是,移植这个项目是否有意义,Core Data会给我一些我原来设计中没有的东西吗?
假设原始设计已正确完成,根据对该项目的要求,可能不值得.
但这不是讨论的结束.还有其他事情需要考虑:我的下一个项目是否会有如此轻松的数据库要求?由于时间表或预算限制,我是否需要尽快发货?假设我迟早要学习核心数据,现在就这样做有意义吗?我可能有兴趣将代码移植到Mac上吗?
这些问题的答案可能会导致您做出的决定是,确实值得回到绘图板,以及了解Core Data的全部内容.
为了得出你的最后一个问题:有什么好处?好吧,Core Data是数据库的更高级抽象,它也是数据存储不可知的(所以如果iPhone的未来版本要抛弃SQLite的嵌入式MySQL版本......不太可能,但它就是一个例子)然后Core数据需要对代码进行非常少的更改才能使其与新数据存储一起使用.Core Data将为Mac平台提供大量快速便携性.Core Data将处理您的数据模型的版本控制,而除非您有一个框架或工作流来管理它,否则不会直接访问SQLite.
我敢肯定其他的回答者可以提出其他优势,也许还有一些很好的理由可以解释为什么不捣乱核心数据.顺便说一句,在类似的情况下,我的决定是移植到更高级别,更新的框架.但在我的情况下,这是一个侧面项目,发货日期和预算是非因素.