iPhone上最好的SQLite实践

时间:2009-05-17 15:27:51

标签: iphone objective-c cocoa-touch sqlite

在iPhone上广泛使用SQLite时,要记住哪些最佳做法?提示/技巧/便利因素均受到赞赏。

7 个答案:

答案 0 :(得分:8)

我建议使用FMDB作为一个不错的Cocoa SQLite包装器。

答案 1 :(得分:8)

测量应用程序的内存占用量并查找仪器中的泄漏情况。然后在调用sqlite3_exec后尝试:

  • pragma cache_size=1

和/或

  • pragma synchronous=0

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

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

答案 2 :(得分:6)

脱离我的头顶:

  • 使用交易。
  • 确保您的SQL利用correct order
  • 中的表格
  • 不要添加您不完全确定需要的索引。

或许不仅仅针对iPhone而是针对嵌入式设备,还有一些很棒的提示here

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

最后,这个Stack Question也有一些不错的信息。

我们目前使用带有.Net Compact Framework应用程序的SQLite,它的性能非常出色,我们花了一些时间进行优化,但并没有尽可能多。

祝你好运。

答案 3 :(得分:3)

我发现在复杂查询中获取我正在寻找的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中广泛使用了水合/脱水模式,这是该技术的超集。

答案 4 :(得分:1)

我很懒,喜欢尽可能地坚持核心代码,因此我喜欢ORM工具SQLitePersistentObjects:

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

您使域模型对象继承自SQLitePersistentObject(确定有点干扰),然后您可以根据需要保留/检索对象。

坚持:

[person save];  

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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