我正在构建一个应用程序,它必须根据相对较大的数据集上的日期进行简单的搜索,排序和限制,大约10000行左右。
数据是只读的,必须与应用程序捆绑在一起,并且可能会在更新时覆盖而无需迁移。
我之前已成功使用二进制plist,但我从来没有必要搜索和排序数据,它总是足够小,可以完全加载到内存中。
预加载coreData看起来像是一件苦差事,特别是因为数据最有可能是只读的。我读过一些描述方式的博客,它们似乎都非常黑客。
我想我的问题是:
是否有预加载coreData的好方法,或者有没有办法从plist中搜索和排序数据,还是有其他方法?
编辑:我似乎误解了coreData的全部内容。我在源代码中找到了这一行:NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"TestFour.sqlite"];
我已将其替换为:
NSURL *storeURL = [[NSBundle mainBundle] URLForResource:@"TestFour" withExtension:@"sqlite"];
简单地将SQLite数据库文件移动到应用程序包中,作为奖励使其成为只读,并且可以通过新的应用程序版本轻松更新。
感谢您对该研究的所有帮助。
答案 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。它具有非常全面的文档和示例代码,易于编写和使用。