如何解决在 FMDB 中调用 sqlite3_step (21: out of memory) rs 时出错
Posted
技术标签:
【中文标题】如何解决在 FMDB 中调用 sqlite3_step (21: out of memory) rs 时出错【英文标题】:how to solve Error calling sqlite3_step (21: out of memory) rs in FMDB 【发布时间】:2012-01-26 05:38:59 【问题描述】:我正在使用我使用的 FMDB 包装器 这段代码
- (BOOL)update:(NSString *) Body fromValue:(NSString *)froms
BOOL success = NO;
FMResultSet *rs;
//I have **searchTable** and in that folder name **OFFICE**
rs = [self.database executeQuery:@"select searchId,body from searchTable WHERE folder = 'OFFICE'"];
NSInteger primaryKey = -1;
NSString *body = nil;
NSString *md5OfSearchEmailBody = nil;
while ([rs next])
primaryKey = [rs intForColumn:@"searchId"];
body = [rs stringForColumn:@"body"];
[rs close];
return success;
第一次
- (BOOL)update:(NSString *) Body fromValue:(NSString *)froms
方法运行良好。在第二次循环中它不起作用
调用 sqlite3_step 时出错(21:内存不足)rs
如何解决这个问题
【问题讨论】:
你是怎么解决这个问题的?我看到您将答案标记为正确,但我想知道您做了什么,因为我遇到了同样的问题。您解决了问题还是改用了 Core Data? 【参考方案1】:检查[rs close];
可能是释放或关闭数据库。
================================================ ====
最好使用 CoreData 在您的应用程序中实现 sqlite。
当应用程序中有更好的内部库时,为什么要使用外部库。您不需要删除您的 sqlite 表。您可以轻松地将现有数据库迁移到 CoreData。
【讨论】:
仅供参考,最好使用外部库,因为它比应用程序中可用的内部库更好。【参考方案2】:即使在 [rs close] 之后,我的记忆力也越来越差;所以我用了:
while ([rs next])
@autoreleasepool
//stuff like......[rs stringForColumn:@"category_id"];...
[rs close];
我解决了我的内存增长以及内存不足错误。
谢谢
【讨论】:
【参考方案3】:我遇到了同样的错误。所以基本上我有两个函数,比如 func1() 和 func2()。
在 func1() 中,我做了以下事情:
1.) 生成结果集。 2.)打印结果(测试) 3.) 以结果集作为参数调用 func2()。
在 func2() 中,我在尝试遍历从 func1() 收到的结果集时遇到了错误。
当我删除 func1() 中的代码(第 2 步)时,错误消失了!
【讨论】:
【参考方案4】:我遇到了同样的错误,因为在调用 [resultSet next] 之前调用了 [database close]。
FMDatabase *db;
[db open];
FMResultSet *set = [db executeQuery:@"some select"];
[db close];
while ([set next])
// get Error calling sqlite3_step (21: out of memory) rs
[set close];
在调用[resultSet next]之后应该调用[database close]
FMDatabase *db;
[db open];
FMResultSet *set = [db executeQuery:@"some select"];
while ([set next])
// no error
[set close];
[db close];
【讨论】:
【参考方案5】:为了解决内存不足的问题,我必须像下面这样设置我的代码来检查循环结束时是否循环 == LocationCount 然后中断循环。如果我忽略它,它会 [rs next] 然后给我 Error calling sqlite3_step (21: out of memory) rs。 我建议做类似的事情,这样 [rs next] 不会比您的功能所需的更多。
int loop = 0;
while ([rs next])
// additional code here
loop = loop + 1;
if (loop == LoopMaxCount)
break;
else
[rs next];
【讨论】:
【参考方案6】:当我在上一次调用[rs next]
返回false
之后错误地调用[rs next]
时出现此错误。
【讨论】:
以上是关于如何解决在 FMDB 中调用 sqlite3_step (21: out of memory) rs 时出错的主要内容,如果未能解决你的问题,请参考以下文章
如何在 IOS Swift 中使用 SQLite 使用 FMDB 处理多个线程