【发布时间】:2010-10-26 20:47:21
【问题描述】:
在 iPhone 上广泛使用 SQLite 时需要牢记哪些最佳实践?提示/技巧/便利因素都值得赞赏。
【问题讨论】:
标签: iphone objective-c cocoa-touch sqlite
在 iPhone 上广泛使用 SQLite 时需要牢记哪些最佳实践?提示/技巧/便利因素都值得赞赏。
【问题讨论】:
标签: iphone objective-c cocoa-touch sqlite
我可以推荐使用FMDB 作为一个不错的 Cocoa SQLite 包装器。
【讨论】:
测量您的应用的内存占用并查找 Instruments 中的泄漏。然后在调用 sqlite3_exec 后尝试:
pragma cache_size=1和/或
pragma synchronous=0YMMV。有关于性能提升、RAM 使用量大幅减少和泄漏减少的报告。但是,在不了解影响的情况下进行调整时要小心(例如,synchronous 会关闭刷新,这会大大加快速度,但如果手机在错误的时间重启,可能会导致数据库损坏)。
【讨论】:
在我的头顶:
也许不仅针对 iPhone,而且针对嵌入式设备,都有一些很棒的技巧here。
link 属于旧版本的 SQLite,但仍然有用。
最后这个Stack Question 也有一些很好的信息。
我们目前将 SQLite 与 .Net Compact Framework 应用程序一起使用,它的性能非常好,我们已经花了一些时间进行优化,但还没有达到我们所能做的那么多。
祝你好运。
【讨论】:
我发现,在复杂查询中获取我正在寻找的 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 中的水合/脱水模式,这是该技术的超集。
【讨论】:
我比较懒,喜欢尽可能的坚持核心代码,所以喜欢ORM工具SQLitePersistentObjects:
http://code.google.com/p/sqlitepersistentobjects/
你让你的领域模型对象继承自 SQLitePersistentObject(好吧有点侵入性),然后你可以根据需要持久化/检索你的对象。
坚持:
[person save];
重新加载它几乎同样简单。任何可持久对象都会添加动态类方法以允许您进行搜索。因此,我们可以像这样检索所有姓氏为“Smith”的 Person 对象:
NSArray *people = [PersistablePerson findByLastName:@"Smith"];
【讨论】:
我还没有尝试过的另一个选项是Core Data(需要是 Apple iphone 开发人员),虽然它是 3.0 功能,所以这取决于你的应用程序是否是一个选项..
【讨论】:
PLDatabase 是 FMDB 的替代品:http://code.google.com/p/pldatabase/
我在我的一个项目中使用它没有问题。
【讨论】: