【问题标题】:Best practices about deploying an iOS application to the App Store using Core Data?使用 Core Data 将 iOS 应用程序部署到 App Store 的最佳实践?
【发布时间】:2013-03-31 06:23:17
【问题描述】:

我目前正在开发一个本机 (Objective C) iOS 应用程序(适用于 iPhone 和 iPad),我计划将它放到 App Store 上(iOS 6.1,在 Mountain Lion 10.8.3 上使用 Xcode 4.6.1)。

此应用程序需要在设备本地存储一些数据,以使我的应用程序在离线(无网络)时仍可运行。我选择使用 Core Data 是因为它易于使用,而且你仍然可以用它做一些更复杂的事情。

我的问题...关于使用 Core Data 数据库将应用程序部署到 App Store 的最佳做法是什么?

1) 使用空的 Core Data 数据库部署我的应用程序,并让它在首次启动或用户单击某个刷新按钮时自动下载数据?

优点:

  • 用户可以偶尔单击一些刷新按钮来更新应用程序数据(无需更新整个应用程序,只需更新数据即可)。

缺点:

  • 在填充数据库之前,该应用程序将无法使用。
  • 必须在某处的服务器上维护和托管 Web 服务以响应应用程序的调用(托管成本,必须开发全新的 Web 服务,另一个故障点)

2) 使用预填充的 Core Data 数据库部署我的应用程序,并在我偶尔更改数据时让用户从 App Store 更新应用程序?

优点:

  • 从 App Store 下载后,该应用程序将立即运行。
  • 无需服务器端。

缺点:

  • 如果我想刷新数据,用户必须从 App Store 更新整个应用程序。

对于我,开发人员来说,最简单的方法是#2,因为我不必部署服务器端应用程序......但这甚至可以做到吗?我可以轻松地创建一个虚拟类来填充我的 iPhone 模拟器上的数据库,但是否可以将此数据库与我的应用程序捆绑在一起并将其部署到 App Store? #1是唯一的方法(或最好的方法)吗?有没有我没有想到的第三种选择?

我很想听听您在这方面的经历...并且不要害怕提出您能想到的任何建议。谢谢!

【问题讨论】:

  • 据我了解核心数据,将您的应用程序与现有的持久存储一起发布应该没有问题,它只是一个文件。不过,我不知道模拟器将它的文档存储在哪里。
  • 我想知道如何使用现有的预填充核心数据数据库发布应用程序。

标签: iphone ios


【解决方案1】:

这真的取决于你需要/想要做什么。这两种方法都是有效且可行的。两者我都亲自实现了。

以下是我可以告诉你的:

  • 信息会改变:除非你正在编写一个关于数学的应用程序,否则事情很可能永远不会改变(除非最初有错误)。它可以使您的应用程序很快变得不正确/过时。发送应用更新需要一些时间。

  • 互联网可能不可靠:您可以假设用户有数据连接来下载应用程序。但是,这并不意味着他们第一次打开应用程序时就会拥有一个。有时他们会将其设置为下载并将其设备放在一边。他们可能稍后会打开应用程序,并且可能不存在数据连接。

  • 您可以同时使用这两种方法:我们开发了一款应用程序,用于在手机信号接收不良的地方进行自助游。鼓励游客使用信息中心 WIFI 下载该应用程序,但一旦他们走出门,手机接收信号就很差/不可用。我们必须在包中包含一个预先填充的 SQL。如果第一次打开应用程序时没有互联网,那么它将自动从捆绑包中加载,否则它会从可以轻松更新信息的简单服务(几乎是转储)下载它。

同样,这实际上取决于您要做什么以及您的要求和限制是什么。从本质上讲,它们都是有效且可行的方法。我个人更喜欢有一种方法来更新信息,而无需发送应用程序更新,根据我的经验,这可能需要数周时间才能公开可用。

有一些库可以为您完成大部分 Web 服务客户端实现(JSON 和 XML 解析器)。包括他们是相当容易的。您所要做的就是通过 url 显示该信息。

回到您的“我可以包含捆绑数据库”的问题。是的你可以。这是您可以从包中导入 SQLite 文件的方式:

在您的应用委托中的persistendStoreCoordinator 中执行此操作

    NSFileManager *fileManager = [NSFileManager defaultManager];

    if(![fileManager fileExistsAtPath:directoryPath(@"YourSQLFile.sqlite")]) {

        NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"YourSQLFile" ofType:@"sqlite"];

        NSError *error = nil;


        if(defaultStorePath) {
            [fileManager copyItemAtPath:defaultStorePath toPath:[storeURL path] error:&error];
        }

    }

【讨论】:

  • 我的应用程序数据会更改,可能不会那么频繁,但肯定会更改。我很想听听更多关于如何“在包中包含预填充的 SQL”以及如何“从简单的服务(几乎是转储)下载它”的信息。如果您能详细说明这些,我将不胜感激。谢谢!
  • 我根本不担心 Web 服务客户端的实现,而是更关心如何使用现有的、预填充的核心数据数据库发布应用程序以及如何实现服务器端服务 (我只是一个在家的开发者,我得找个地方来托管这个?)
  • @Ares,SQLite 和 Core Data 是一回事吗?我正在使用 Core Data,您的示例仍然有效吗?
  • @Pascal SQLite 是 Core Data 的默认底层数据库。除非您特别更改它,否则 Core Data 将使用 SQLite 数据库。
  • @Pascal 没问题。如果您认为这回答了您的问题,请将其标记为“正确答案”以供将来参考。
猜你喜欢
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 2015-08-05
  • 2022-01-04
  • 1970-01-01
  • 2011-07-26
相关资源
最近更新 更多