Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iphone中使用sqlite数据库时的内存管理_Iphone_Sqlite - Fatal编程技术网

在iphone中使用sqlite数据库时的内存管理

在iphone中使用sqlite数据库时的内存管理,iphone,sqlite,Iphone,Sqlite,我的应用程序使用SQLite数据库来存储用户的输入。输入中的记录数将达到大约100条记录,我在应用程序中有很多SQL操作 当我使用对象分配运行应用程序时,它会显示sqlite库libsqlite3.0.dylib,占用了大量内存。libsqlite框架是否会导致内存泄漏?与数据库通信的最佳方式是什么?大量的sql调用增加了我的应用程序的内存使用 有人能告诉我在应用程序中有效使用sqlite的最佳方式吗。(我使用SQLiteBooks示例作为参考) 谢谢。Sqlite对请求使用缓存。随时关闭并重新

我的应用程序使用SQLite数据库来存储用户的输入。输入中的记录数将达到大约100条记录,我在应用程序中有很多SQL操作

当我使用对象分配运行应用程序时,它会显示sqlite库libsqlite3.0.dylib,占用了大量内存。libsqlite框架是否会导致内存泄漏?与数据库通信的最佳方式是什么?大量的sql调用增加了我的应用程序的内存使用

有人能告诉我在应用程序中有效使用sqlite的最佳方式吗。(我使用SQLiteBooks示例作为参考)


谢谢。

Sqlite对请求使用缓存。随时关闭并重新打开数据库以释放缓存

除非你的记忆力要求很高,否则你不应该在意

您可以在UIApplicationDelegate方法ApplicationIDReceiveMemoryWarningUIViewController委托方法didReceiveMemoryWarning


如果调用了其中一个方法,请关闭并重新打开数据库。

我没有看到任何由sqlite引起的内存泄漏。它确实使用了一个合理的内存块,但想想你需要写多少代码和缓存多少数据才能完成同样的事情

最好的建议是使用高效的SQL并尽快重置语句句柄。完成你准备好的陈述也可能有帮助,尽管我觉得没有必要这样做

人们通常建议定期关闭和重新打开数据库。虽然这不会伤害我,但我自己也没有看到任何实际的好处


最后,在sqlite网站上,您将看到关于。这些听起来很诱人,直到你意识到它们是可选的,并且在iPhone的默认版本中没有启用。

也有。

我以前看到过内存使用激增,当时我有一个相对较大的数据库,因为索引不好。如果您向数据库中添加一些经过深思熟虑的索引,这将是一种快速简便的方法,可以在现实世界中恢复内存使用情况。

我在SQLite中连续执行多个插入(>1000)时,内存使用率会急剧上升。写入性能也很慢。通过在事务中进行插入来包装循环,几乎完全消除了这些问题。我为此发布了一些示例代码以回应。

您确实想限制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缓存您的查询并慢慢消耗所有内存。

谢谢Stephan。但是如果我这样做了,并且有一些查询还没有完全执行,那么操作是回滚还是完成,然后关闭数据库?如果使用BEGIN。。。提交,如果数据库关闭,事务将回滚。您好,Stephen。关闭一个数据库并再次打开就是给了这个异常,谢谢Stephen。我没有缓存数据库中的任何数据,所有数据在需要时都是只读的。语句的函数结束后,也会立即进行重置。我也在最后完成发言。还有其他建议吗?再次感谢。PRAGMAs对iPhone没有帮助,因为苹果提供了二进制库。PRAGMAs在运行时执行,而不是在编译时执行。这是因为SQLite使用其页面缓存的方式。如果在事务中放入INSERT/UPDATE语句,则它仅在内存中进行修改,然后在提交时批量写入。如果您没有显式事务,SQLite会在每次插入、更新或删除周围放置一个隐式事务。此外,SQLite总是更新数据库的整个4k页面,即使您只修改了该页面中的一位数据。我应该在执行每个sql事务时这样做吗??