为 iOS 应用程序存储数据的最佳方法? [关闭]

Posted

技术标签:

【中文标题】为 iOS 应用程序存储数据的最佳方法? [关闭]【英文标题】:Best method to store data for an iOS app? [closed] 【发布时间】:2018-12-15 14:55:40 【问题描述】:

随着学习 swift 的进步,我想开发一个库存/物品库存应用程序。它基本上是具有项目名称、数量和位置的东西。

例如。

灯泡,25,工作车

开关,6,仓库

当用户输入此数据并按下按钮时,存储此数据并在以后检索它的最佳方法是什么。我知道我可以将它附加到一个数组并显示该数组,但是如果应用程序关闭怎么办?

我应该考虑学习数据库存储吗?我可以将数据保存到手机吗?

【问题讨论】:

您可以使用 Core Data 来存储您的数据以进行持久存储。 当您通过开发库存应用程序快速学习时,您应该使用CoreData,因为您可以学习如何将数据保存到数据库中,其他原因可能是位置数据。稍后,您可能需要根据位置搜索数据,这样CoreData 将帮助您很多。 【参考方案1】:

存储这些数据并在以后检索它的最佳方法是什么。

最佳方法将取决于一系列因素,例如:

您要保存多少条记录? 您需要将此数据与服务器同步吗? 性能有多重要? 您对使用 Swift 和 ios 存储数据了解多少? 您要保存的数据发生变化的可能性有多大?

随着时间的推移,所有这些问题的答案可能会发生变化,随着您了解更多并在应用程序上取得更多进展,并且可能会更多地了解用户的需求。因此,保存数据的最佳方法是构建一些可以让您轻松更改甚至替换数据存储系统的东西,而无需通过应用程序的其余部分进行更改。

换句话说,你需要为你的数据存储需求定义一个接口。接口就像一个栅栏,一侧是实际的数据存储,而应用程序的其余部分(用户接口、网络等)。

拥有一个清晰的数据存储系统界面可以让您使用最简单的数据存储系统快速启动并运行您的应用程序。您可以将数据存储为字典数组,例如,使用数组方法write(to:atomically:) 将其全部写入属性列表,然后使用init(contentsOf:) 将其读回。到目前为止,您只描述了对一种记录的需求,每条记录只有几个字段。将数据存储在数组中并将其写入属性列表对于数百甚至数千个条目都可以正常工作;在真正需要重写数据存储系统之前,您可能会重新考虑您的用户界面,因为没有人喜欢滚动浏览数百个项目的列表。

随着应用的发展,您发现自己不想一次将所有数据保存到内存中,或者您希望随应用一起传送一些数据并将其与用户输入的数据分开,或者如果你想加快你的数据存储速度,你可以编写一个新的符合相同接口的数据存储系统。然后您可以在不影响应用程序的其余部分的情况下更换新系统。因此,您可以改用 Core Data 之类的花哨的东西,或者您可以实现基于服务器的存储,而无需重写您的应用程序的大块。

为您的数据存储系统创建一个清晰的界面还可以轻松编写一组单元测试,以确保您的数据存储系统完全按照它应该做的事情并且不会中断。拥有一组单元测试将很容易确保您的数据存储系统的未来版本与其替代的版本一样正确。


这里的其他一些人建议使用 Core Data。 Core Data 很棒,但使用它很多复杂,而不是仅仅从文件中读取数据并在完成后将其写回。使用数组存储数据和使用 Core Data 存储数据之间的区别非常类似于文本文件和关系数据库之间的区别。 Core Data 是一个对象图管理器:它可以存储许多不同类型的对象以及它们之间的关系,它可以存储数千个所有这些对象并非常快速地访问它们。当您开始跟踪库存中商品的图像、每件商品的供应商、购买商品的客户、商品的买卖价格等,Core Data 将真正简化管理所有数据的任务。但是现在尝试学习和使用 Core Data,虽然您的需求非常简单,并且您也在尝试学习一门新语言,但会减慢您的速度,而没有任何真正的好处。记住 KISS principle 并从简单开始,但要以一种易于发展的方式。

【讨论】:

好建议。如果“需要将此数据与服务器同步”,会有哪些选择? (假设数据小而简单,假设是已完成级别和分数的列表)。 @Sébastien 这有很多方面。如果您最感兴趣的是在用户的多个设备之间同步数据,并且您不在乎服务器是什么,那么CloudKit 可能是一个不错的选择。 @Sébastien 另外:如果你真的在谈论保存游戏信息,你应该查看GameKit,它提供了完全一样的功能——甚至还有一个GKSavedGame 类。【参考方案2】:

如果您要存储的数据很少且不敏感,则可以使用 UserDefaults 例如,用户的姓名、年龄等。

对于大量数据,您应该使用 Core Data,它是管理对象的好方法。例如,您有 1000 个项目,每个项目都有一个属性,您基本上可以使用核心数据。关于如何创建托管对象、存储它们以及以后如何使用查询检索它们非常简单。

基本上,当您使用核心数据配置项目时,项目会创建一个附加到项目的 sqlite 文件。

关于如何开始使用 Core Data 的教程有很多,如果你对 iOS 有一般的经验,这对你来说是小菜一碟。

这是一个很好的教程,可以帮助您在项目中设置核心数据:

https://www.raywenderlich.com/173972/getting-started-with-core-data-tutorial-2

【讨论】:

@Ari,如果您需要有关详细信息的帮助,请创建另一个问题并随时与我联系,我可以帮助您设置。 谢谢!我将从 userdefault 开始,然后一旦掌握了它,我将继续查看是否可以使用 CoreData 使其与多个用户一起使用。谢谢!【参考方案3】:

您可以根据您的具体要求使用以下任一方法。

    核心数据:可以找教程here。 使用 SQLite DB:您可以找到教程here。 如果简单,不需要存储大量信息,那么你甚至可以使用文件系统来存储数据。甚至 PList 也是可能的。

【讨论】:

【参考方案4】:

对于刚刚登录的单个用户,您可以将其存储在UserDefaults 中。但是,如果您必须管理用户列表,请使用 Core Data。

【讨论】:

太棒了!这就是我想知道的。我将从单个用户开始,但随着我的学习,我想看看我是否可以让多个用户都有自己的项目列表,再次感谢【参考方案5】:

这两者之间有很大的不同。 SQLite 本身就是一个数据库,就像我们拥有 MS SQL Server 一样。

然而,CoreData 是一个 ORM(对象关系模型),它在数据库和 UI 之间创建了一个层。它加快了交互过程因为我们不必编写查询,只需使用 ORM 并让 ORM 处理后端。对于大数据的保存或检索,我推荐使用Core Data,因为它能够处理设备的较低处理速度。

结果:

SQLite

具有数据约束功能。 对存储在磁盘上的数据进行操作。 可以删除表和编辑数据而不将它们加载到内存中。 与核心数据相比速度较慢。 您可以将 SQL 用于复杂的数据结构

核心数据:

没有数据约束,如果需要需要业务实现 逻辑。

在内存中运行。(数据需要从磁盘加载到内存中)

如果我们需要删除表或更新,则需要加载整个数据。

记录创建速度很快。(保存它们可能很耗时)

没有 sql。只需将数据加载到数组并在该数组中使用。

在我看来;如果您需要一些数据,您的应用程序的设置、用户身份验证信息或类似作品使用 CoreData

如果你有大数据要存储,你需要从许多数据记录中选择一个使用 SQLLite。

希望对你有帮助。

【讨论】:

以上是关于为 iOS 应用程序存储数据的最佳方法? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我想找到一种使用 Firebase 作为 Android、IOS 和 Web 应用程序后端的最佳方法 [关闭]

为 iOS/Android 应用程序存储敏感数据的最佳方式是啥?

存储谷歌地图数据的最佳地点[关闭]

React Native:关闭应用程序时在 iOS 上运行后台任务的最佳方法?

在 PhoneGap IOS 上缓存图像的最佳方法

什么是在本地为 iOS/Android 存储大数据的最佳方式