【问题标题】:What is best way to store long term data in iPhone Core Data or SQLite?在 iPhone Core Data 或 SQLite 中存储长期数据的最佳方式是什么?
【发布时间】:2011-03-03 11:53:04
【问题描述】:

我正在开发针对 3.1.3 及更高版本 SDK 的 iPhone 应用程序。我想知道在不影响性能、一致性和安全性的情况下,在 iPhone 上存储用户长期数据的最佳方式。

我知道,我可以使用 Core Data、PList 和 SQL-Lite 来以自定义格式存储用户特定的数据。但是,我想知道在不久的将来,在不影响应用性能和可扩展性的情况下,哪一种更好用。

【问题讨论】:

    标签: ios iphone core-data store


    【解决方案1】:

    这取决于。术语“用户数据”涵盖了广泛的规模、复杂性和使用情况,每个都有不同的最佳存储策略。

    (1) 如果大小和复杂性较低且使用主要是控制应用程序本身,则使用 NSUserDefaults 将数据存储在用户默认值中。

    (2) 如果大小很小并且可以通过数组、字典等管理复杂性,则存储在 plist 中。大小很重要,因为存储在 plist 中的所有数据都以一个块的形式加载到内存中。

    (3) 如果尺寸很大但复杂度很低,例如大量模板记录如索引卡片系统,则使用直接SQL。 SQL 在非常大的数据库中查找和保存简单且重复的信息时速度更快。

    (4) 如果复杂度很高,不管大小,都使用Core Data。 Core Data 专为管理复杂信息而设计。如果大小很小,请使用 xml 存储。如果它很大,请使用 SQL 存储。

    随着我对 Core Data 的熟悉,我发现除了用户默认值之外,我几乎在所有事情上都使用它。它有一个陡峭的学习曲线,但一旦你掌握了它,你就会拥有一个强大且易于使用的工具来管理应用程序数据。我可能会在它不是最佳的情况下使用它,因为它加快了开发时间。

    【讨论】:

    • 感谢您的宝贵解释。根据您的详细信息,我似乎可以直接使用 SQL DB 以及 Core Data。不过,我需要存储的数据是一个很小的结构,属性很少,存储时我不需要额外注意。所以,我只关心我的应用程序的性能和未来版本的 SDK 兼容性。另外,如果我需要保护或加密数据怎么办? Sqlite 是否提供了一种加密数据库或使用密码保护它的方法,或者如果我需要保护数据,我需要使用核心数据。
    • 听起来目前你可以只使用 plist 文件。如果你使用 NSArray 或类似的类来实现你的数据结构,你可以使用writeToFile:method 将最顶层的集合对象写入磁盘。一旦加载,数据就会保留在内存中,因此性能非常高。这依赖于基础方法,因此可以保证未来的兼容性。这种方法近 20 年没有改变。
    • 为了安全,请使用钥匙串服务。加密整个数据库会带来巨大的处理器负载,通常没有必要。在 iOS 上,只需将数据库放在任何地方,但文档文件夹会阻止所有外部软件访问数据库。但是,这是可能的。我已经看到自定义 NSManagedObject 子类在设置每个属性时对其进行加密。即使有人确实进入了数据库,他们也会发现它充满了胡言乱语。
    • 我不同意这个答案。 PLists 和原始 SQLite 是持久化数据的糟糕选择。我已经详细说明了我的回答。
    【解决方案2】:

    我不得不不同意 TechZen 的列表。只有在处理旧版 SQLite 数据库时,数字 3 才是正确答案。没有理由选择原始 sqlite 而不是 Core Data。 Core Data 在几乎所有情况下都会表现得更好,并且会大大减少您必须编写的代码量。

    此外,我会告诫不要使用 plist。它们的读写成本很高,Core Data 数据库几乎在所有情况下都比它们好。

    至于使用 Core Data,您应该始终使用 SQLite 后端(XML 在 iOS 上不可用),除非在最极端的情况下。

    简而言之,如果您要保存单个值,请将其存储在 NSUserDefaults 中。

    否则使用核心数据。

    更新

    目前,Core Data 无法完成比原始 SQLite 更高性能的一件事。这就是在数万行中更新单个列的值的能力。这是因为要修改一行,Core Data 将该行加载到内存中,然后再次将其写回。

    对于所有其他情况,您将使用 Core Data 获得比您编写自己的访问器、对象以及处理其内存和生命周期更好的性能。

    Core Data 的性能将优于您自己编写的任何数据访问器,并且它将以比您更好的方式处理对底层文件的写入和读取。为什么要重新发明轮子?

    【讨论】:

    • 感谢大家,为我提供专家建议。我知道我可以直接使用 SQLite 或通过 Core Data 使用 SQLite。但是,我仍然对直接或通过 Core Data 的 SQLite 性能有些困惑。请让我知道:SQLite 作为 Core Data 的后端与直接使用其 API 使用 SQLite 之间有什么区别。我知道如果数据库中有大量数据,我们可以很容易地通过 SQL 查询过滤记录。那么Core Data呢?我们可以根据某些条件获取记录而不获取整个表吗?
    猜你喜欢
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2013-06-14
    • 2021-10-22
    • 1970-01-01
    • 2020-08-02
    相关资源
    最近更新 更多