我的应用程序使用SQLite数据库来存储用户的输入。输入中的记录数将大约为100条记录,我在应用程序中进行了大量的SQL操作。
当我使用Object Allocations运行应用程序时,它会显示sqlite库libsqlite3.0.dylib占用大量内存。 libsqlite框架会导致内存泄漏吗?与数据库通信的最佳方式是什么?进行大量的SQL调用会增加我的应用程序的内存使用量。
有人可以让我知道在应用程序中有效使用sqlite的最佳方法。 (我使用SQLiteBooks示例作为参考)
感谢。
答案 0 :(得分:8)
Sqlite为请求使用缓存。关闭&从时间重新打开数据库以释放缓存。
除非你的记忆要求很高,否则你不应该在意。
您可以在 UIApplicationDelegate 方法 applicationDidReceiveMemoryWarning 或 UIViewController 委托方法 didReceiveMemoryWarning
中捕获关键条件如果调用其中一种方法,请关闭&重新打开数据库。
答案 1 :(得分:5)
我没有看到由sqlite引起的任何内存泄漏。它确实使用了一块合理的内存,但想想你需要编写多少代码以及需要缓存的数据来做同样的事情...
最好的建议是使用高效的SQL并尽快重置语句句柄。完成准备好的陈述也可能有所帮助,尽管我没有发现需要这样做。
人们经常建议您定期关闭并重新打开数据库。虽然这不会伤害我自己也没有看到任何实际的好处。
最后,在sqlite网站上,你会看到functions to manage memory的话题。这些听起来非常诱人,直到您意识到它们是可选的并且未在iPhone上的默认构建中启用。
答案 2 :(得分:4)
答案 3 :(得分:3)
当连续执行多次INSERT(> 1000)时,我已经在SQLite中使用了内存。写性能也很慢。通过在事务中包装执行INSERT的循环,几乎完全消除了这些问题。为了回应this question,我发布了一些示例代码。
答案 4 :(得分:2)
你真的想要限制iphone应用程序中sqlite的缓存大小。启动应用程序并初始化数据库时,请运行以下命令:
const char *pragmaSql = "PRAGMA cache_size = 50";
if (sqlite3_exec(database, pragmaSql, NULL, NULL, NULL) != SQLITE_OK) {
NSAssert1(0, @"Error: failed to execute pragma statement with message '%s'.", sqlite3_errmsg(database));
}
这将阻止sqlite缓存您的查询并慢慢消耗所有内存。
答案 5 :(得分:1)
由于索引不佳,我之前看到内存使用量激增,因为数据库比较大。如果您在数据库中添加一些经过深思熟虑的索引,这是一种快速简便的方法,可以在现实世界中恢复内存使用。