在IOS上寻找合适的数据存储区

时间:2012-12-25 16:05:31

标签: iphone ios core-data plist

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

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

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

预加载coreData看起来像是一件苦差事,特别是因为数据最有可能是只读的。我读过一些描述方式的博客,它们似乎都非常黑客。

我想我的问题是:

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

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

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

我已将其替换为:

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

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

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

5 个答案:

答案 0 :(得分:3)

如果要在应用程序中搜索和排序给定数据,我建议使用带有预加载数据集的SQLite或Core Data。如果是后者,请查看this

答案 1 :(得分:2)

我建议你不要重新发明那个特定的轮子。核心数据非常适合该数据集。 UITableview,NSFetchedResultsController和NSFetchRequest是针对这个问题而做的。

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

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

Norbert引用的Ray Wenderlich教程取决于无证行为。特别是不支持直接写入.sqlite文件。

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

答案 2 :(得分:1)

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

请参阅以下有关iOs good-tutorial-for-sqlite3-with-objective-c-iphone

的SQLite教程的问题

答案 3 :(得分:1)

为iOS应用程序预加载Core Data商店几乎没有什么问题。

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

作为示例 - 我用桌面应用程序编写了一个example project,该应用程序接收csv文件,将其加载到Core Data存储中,并报告该文件的位置。然后显示如何将此文件包含到应用程序包中并使用它。

答案 4 :(得分:0)

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