【问题标题】:Best SQLite practices on the iPhone [closed]iPhone 上的最佳 SQLite 实践 [关闭]
【发布时间】:2010-10-26 20:47:21
【问题描述】:

在 iPhone 上广泛使用 SQLite 时需要牢记哪些最佳实践?提示/技巧/便利因素都值得赞赏。

【问题讨论】:

    标签: iphone objective-c cocoa-touch sqlite


    【解决方案1】:

    我可以推荐使用FMDB 作为一个不错的 Cocoa SQLite 包装器。

    【讨论】:

    • 你确定它没有内存泄漏,使用安全等吗?它当然不完整并且显然不受支持。我说,使用 CoreData 并在(如果)变坏时调整性能
    • 在查看我的应用程序是否存在泄漏时,我从未在库中发现任何漏洞。
    【解决方案2】:

    测量您的应用的内存占用并查找 Instruments 中的泄漏。然后在调用 sqlite3_exec 后尝试:

    • pragma cache_size=1

    和/或

    • pragma synchronous=0

    YMMV。有关于性能提升、RAM 使用量大幅减少和泄漏减少的报告。但是,在不了解影响的情况下进行调整时要小心(例如,synchronous 会关闭刷新,这会大大加快速度,但如果手机在错误的时间重启,可能会导致数据库损坏)。

    更多:http://www.sqlite.org/pragma.html

    【讨论】:

    • +1 为此,cache_size 会占用 iPhone 上的大量内存,我花了一段时间才找到这个。
    【解决方案3】:

    在我的头顶:

    • 使用事务。
    • 确保您的 SQL 使用 correct order 中的表。
    • 不要添加您不确定是否需要的索引。

    也许不仅针对 iPhone,而且针对嵌入式设备,都有一些很棒的技巧here

    link 属于旧版本的 SQLite,但仍然有用。

    最后这个Stack Question 也有一些很好的信息。

    我们目前将 SQLite 与 .Net Compact Framework 应用程序一起使用,它的性能非常好,我们已经花了一些时间进行优化,但还没有达到我们所能做的那么多。

    祝你好运。

    【讨论】:

      【解决方案4】:

      我发现,在复杂查询中获取我正在寻找的 ID,然后按需获取其余信息,通常会更快。

      例如:

      SELECT person_id
        FROM persons
       WHERE (complex where clause)
      

      然后在显示每个人时我会跑

      SELECT first_name, last_name, birth_date, ...
        FROM persons
       WHERE person_id = @person_id
      

      我通常发现这使得复杂查询的运行时间缩短了 1/2,并且对给定人员的查找通常在 2ms 左右(这是在具有 17k 行的表上)。

      您的经验可能会有所不同,您应该自己安排时间。

      另外,我必须感谢 Wil Shipley 在他的演讲中提出了这种技术: http://www.vimeo.com/4421498.

      我实际上广泛使用了 sqlitebooks 中的水合/脱水模式,这是该技术的超集。

      【讨论】:

        【解决方案5】:

        我比较懒,喜欢尽可能的坚持核心代码,所以喜欢ORM工具SQLitePersistentObjects:

        http://code.google.com/p/sqlitepersistentobjects/

        你让你的领域模型对象继承自 SQLitePersistentObject(好吧有点侵入性),然后你可以根据需要持久化/检索你的对象。

        坚持:

        [person save];  
        

        重新加载它几乎同样简单。任何可持久对象都会添加动态类方法以允许您进行搜索。因此,我们可以像这样检索所有姓氏为“Smith”的 Person 对象:

        NSArray *people = [PersistablePerson findByLastName:@"Smith"];
        

        【讨论】:

          【解决方案6】:

          我还没有尝试过的另一个选项是Core Data(需要是 Apple iphone 开发人员),虽然它是 3.0 功能,所以这取决于你的应用程序是否是一个选项..

          【讨论】:

          • 当前所有应用提交都需要使用 3.0 SDK 构建,所以我认为 Core Data 可能是最好的选择。
          • 据我了解,提交不需要使用 3.0 构建,只需对其进行测试:“所有提交到 App Store 的内容都将在 iPhone OS 3.0 的最新测试版上进行审核.如果您的应用提交与iPhone OS 3.0不兼容,将不会被批准。”
          【解决方案7】:

          PLDatabase 是 FMDB 的替代品:http://code.google.com/p/pldatabase/

          我在我的一个项目中使用它没有问题。

          【讨论】:

            猜你喜欢
            • 2011-01-22
            • 1970-01-01
            • 1970-01-01
            • 2013-10-02
            • 2010-10-06
            • 2011-10-28
            • 2010-09-10
            • 2011-10-11
            • 1970-01-01
            相关资源
            最近更新 更多