Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 针对有SQL经验的开发人员的核心数据与SQLite_Iphone_Sqlite_Core Data - Fatal编程技术网

Iphone 针对有SQL经验的开发人员的核心数据与SQLite

Iphone 针对有SQL经验的开发人员的核心数据与SQLite,iphone,sqlite,core-data,Iphone,Sqlite,Core Data,我们开始在iPhone企业开发者计划中开发内部应用程序。由于它接近OS3.0,我们正在重新考虑使用SQLite和使用核心数据的原始设计。以下是更多信息: 这将替换一个旧的桌面应用程序。我们将重用现有的后端 我们目前有一个SQLite数据库作为概念证明生成。这基本上是现有后端数据库的精简版本 我们将从一个远程站点加载数据并将其存储在本地,数据将在本地保存并需要保存。我们只会在它发生变化时更新它,每一两个月更新一次。我们最有可能使用XML或JSON来传输数据 这个项目有两个开发人员,我们都有很强的

我们开始在iPhone企业开发者计划中开发内部应用程序。由于它接近OS3.0,我们正在重新考虑使用SQLite和使用核心数据的原始设计。以下是更多信息:

  • 这将替换一个旧的桌面应用程序。我们将重用现有的后端
  • 我们目前有一个SQLite数据库作为概念证明生成。这基本上是现有后端数据库的精简版本
  • 我们将从一个远程站点加载数据并将其存储在本地,数据将在本地保存并需要保存。我们只会在它发生变化时更新它,每一两个月更新一次。我们最有可能使用XML或JSON来传输数据
  • 这个项目有两个开发人员,我们都有很强的SQL技能,但都没有使用过核心数据
我的问题是:与SQLite相比,核心数据有什么好处,在这个特定的实例中会有什么好处?这些好处是否证明学习一个新的框架而不是使用现有的强大的SQL技能是合理的

编辑: 我刚刚注意到这个问题:。因此,我想我的问题是:

  • 如果我必须检查某个特定项是否存在或是否有更新(使用SQL很容易),那么核心数据仍然有意义吗?我可以在不加载整个图形的情况下加载图形中的第一个对象并检查版本号吗
  • 如果我们已经知道SQL,那么这一项目的核心数据优势是否证明我们学习SQL是合理的

听起来您已经有了使用SQLite设计的项目,并且您在该领域有经验

所以底线是,移植这个项目有意义吗,核心数据会给我一些我在原始设计中没有的东西吗

根据这个项目的要求,假设最初的设计做得很好,这可能是不值得的

但这并不是讨论的结束。还有其他需要考虑的事情:我的下一个项目是否会有如此轻的数据库需求?由于时间或预算限制,我是否需要尽快发货?假设我迟早要学习核心数据,那么现在就去学习有意义吗?我是否有兴趣将我的代码移植到Mac上

这些问题的答案可能会让您做出这样的决定:是的,可以说,回到绘图板上,了解核心数据的全部内容是值得的

进入最后一个问题:优势是什么?好的,核心数据是数据库的更高层次抽象,它也是数据存储不可知的(因此,如果未来版本的iPhone放弃SQLite而使用嵌入式版本的MySQL…不太可能,但这只是一个例子),那么核心数据只需对代码进行很少的更改即可与新的数据存储一起工作。核心数据将提供大量到Mac平台的快速可移植性。核心数据将处理数据模型的版本控制,而除非您有一个框架或工作流来管理它,否则直接访问SQLite将不会


我相信其他的回答者也能想出其他的优势,也许还有一些很好的理由来解释为什么不去搅乱核心数据。顺便说一句,在类似的情况下,我的决定是移植到更高级别、更新的框架。但在我的例子中,这是一个附带项目,发货日期和预算是非因素。

不要贬低这个论坛,但你可能会在苹果iPhone DevForum上找到更多有相关背景经验的受访者

从纯项目管理的角度来说,听起来您知道如何使用SQLite构建您想要构建的内容,因此我认为您从这条路线开始会更有意义

这就是说,CoreData构建在SQLite之上,如果您试图结合数据利用系统的其他部分,例如使用KVC/KVO或绑定,那么您可能会很快发现此功能值得学习

=Mike

正如您所读到的,您知道核心数据和持久化机制(本例中为SQLite)在很大程度上是正交的。核心数据实际上是关于管理对象图的,它的主要用例是MVC体系结构的模型组件。如果您的应用程序非常适合这种体系结构,那么使用核心数据可能是值得的,因为它将在模型组件中为您节省大量代码。如果您已经有了一个工作模型组件(例如,从现有的桌面应用程序),那么核心数据不会给您带来太多好处。一种混合方法是可能的——您可以自己进行持久化/查询,并构建一个核心内存中数据存储,使用查询结果填充该存储,并通过核心数据将该内存中存储用作应用程序的模型组件。这并不常见,但我已经做到了,并且没有重大障碍

要回答您的具体问题:

  • 您可以为整个持久存储分配一个版本号,并通过
    +[NSPersistentStore metadataForPersistentStoreWithURL:error://code>检索该信息,而无需打开存储。当然,还存在一个等价的
    +setMetadata:forPersistentStoreWithURL:error
    。如果要将版本信息存储在实体实例中而不是持久存储元数据中,则只能加载单个对象。使用SQLite持久存储,核心数据可以很好地只获取您需要的内容

  • NSPredicate
    API非常容易学习,它似乎可以很好地编译SQL。根据我的经验,至少对于iPhone上可以容纳的大小的数据库来说,这是足够的(性能方面)。然而,我认为SQL与核心数据的问题有点误导。一旦你得到一个查询的结果,你将如何处理它?如果您使用自己的,您将必须实例化对象,处理错误/唯一化(如果您不想loa)