2

我正在构建一个应用程序,该应用程序必须根据相对较大的数据集(大约 10000 行左右)上的日期进行简单的搜索、排序和限制。

数据是只读的,必须与应用程序捆绑在一起,并且可能会在更新时被覆盖而无需迁移。

我之前已经成功地使用过二进制 plist,但我从来不需要搜索和排序数据,它总是足够小,可以完全加载到内存中。

预加载 coreData 似乎很麻烦,尤其是因为数据很可能是只读的。我读过一些描述方法的博客,它们似乎都非常hacky。

我想我的问题是:

有没有预加载 coreData 的好方法,或者有没有办法从 plist 中搜索和排序数据,或者有其他方法吗?

编辑:似乎我误解了 coreData 的全部内容。我在源代码中找到了这一行:

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"TestFour.sqlite"];

我已将其替换为:

NSURL *storeURL = [[NSBundle mainBundle] URLForResource:@"TestFour" withExtension:@"sqlite"];

只需将 SQLite 数据库文件移动到应用程序包中,作为奖励,它可以只读并且可以通过新的应用程序版本轻松更新。

感谢您对研究的所有帮助。

4

5 回答 5

3

If it comes to searching and ordering the given data within the application, I'd suggest to either use SQLite or Core Data with a preloaded data set. In the case of the latter, take a look at this.

于 2012-12-25T16:57:24.307 回答
2

我建议你不要重新发明那个特定的轮子。Core Data 非常适合这种大小的数据集。UITableview、NSFetchedResultsController 和 NSFetchRequest 就是针对这个问题而设计的。

我在几个项目中使用的一种模式是创建一个辅助 MacOS 工具,它可以读取旧格式并将其保存到 Core Data 存储中。

在您的 iOS 项目中,将 Core Data 存储作为资源包含在内。当您在 iOS 应用程序中启动 Core Data 堆栈时,您将在主包中查找 .sqlite 文件,而不是在用户文件空间中。如果你想变得花哨,你可以有一个后台线程来尝试下载数据存储的更新版本;如果用户文件空间中有新版本,请使用它而不是预先打包的版本。

Norbert 引用的 Ray Wenderlich 教程依赖于未记录的行为。特别不支持直接写入 .sqlite 文件。

辅助数据加载器 (Mac) 和查看器 (iOS) 共享相同的 .xcdatamodel,以及(如果适用)NSManagedObject 子类的 .h/.m 文件。您使用用于读取数据的相同代码库存储数据。我已经使用这种方法构建了几个 100k 行的项目,并且运行得非常好。

于 2012-12-25T21:10:22.487 回答
1

为 iOS 应用程序预加载 Core Data 存储几乎没有什么技巧。

只需创建一个共享相同模型并将数据写入设置位置的辅助应用程序,然后您可以获取此文件并将其包含到您的应用程序包中。

举个例子——我用一个桌面应用程序编写了一个示例项目,该应用程序接受一个 csv 文件,将其加载到 Core Data 存储中,并报告该文件的位置。然后它展示了如何将此文件包含到应用程序包中并使用它。

于 2012-12-25T21:21:57.097 回答
1

我建议将 SQLite 集成到您的应用程序中。即使您的数据是只读的。您无需将所有数据加载到内存中即可获取某些内容。如果您需要获取已排序的数据,请使用适当的 SQL 查询。为了更新它,再次下载您的数据并使用适当的查询插入它。

请参阅以下有关 iOs good-tutorial-for-sqlite3-with-objective-c-iphone 的SQLite 教程的问题

于 2012-12-25T16:12:21.513 回答
0

我建议存储对象(不要太多的网络服务器端)我建议使用 AWS 作为解决方案。S3 非常适合存储大型对象,您可以使用 CloudFront 将它们分发到全球服务器,但对于较小的对象和更具可扩展性/快速的解决方案,我会使用 DynamoDB 或 SimpleDB。它有非常全面的文档和易于编写和使用的示例代码。

于 2012-12-25T17:02:56.680 回答