iPhone 上的最佳 SQLite 实践 [关闭]

Posted

技术标签:

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

你确定它没有内存泄漏,使用安全等吗?它当然不完整并且显然不受支持。我说,使用 CoreData 并在(如果)变坏时调整性能 在查看我的应用程序是否存在泄漏时,我从未在库中发现任何漏洞。 这可能是一个更好的链接code.google.com/p/flycode/source/browse/#svn/trunk/fmdb【参考方案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/

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

【讨论】:

以上是关于iPhone 上的最佳 SQLite 实践 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

有没有文件可以告诉我关于 iphone 的最佳信息? [关闭]

iPhone应用程序编程中网络呼叫请求/响应的最佳实践[关闭]

为 iphone 4s 和 5/5c/5s 屏幕尺寸开发的最佳实践 [关闭]

将本地 HTML5 DB(WebSQL 存储,SQLite)与服务器同步的最佳方法(2 路同步)[关闭]

具有多个 NIB 的 iPhone 应用程序的最佳实践建议

Django:将项目从 sqlite 迁移到 PostgreSQL 的最佳实践是啥