我正在使用我使用的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
如何解决这个问题
答案 0 :(得分:5)
检查[rs close];
可能是发布或关闭数据库。
=============================================== ====
最好使用CoreData在您的应用程序中实现sqlite。
为什么在应用程序中有更好的内部库时使用外部库。您不需要删除sqlite表。您可以轻松地将现有数据库迁移到CoreData。
答案 1 :(得分:3)
我收到同样的错误,因为在调用[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]后调用[数据库关闭]
FMDatabase *db;
[db open];
FMResultSet *set = [db executeQuery:@"some select"];
while ([set next])
{
// no error
}
[set close];
[db close];
答案 2 :(得分:0)
即使在[rs close]之后我也会失去记忆力;所以我用过:
while ([rs next]) {
@autoreleasepool
{
//stuff like......[rs stringForColumn:@"category_id"];...
}
}
[rs close];
我解决了我的mory增长以及内存错误。
由于
答案 3 :(得分:0)
我遇到了同样的错误。所以基本上我有两个函数,比如func1()和func2()。
在func1()中,我正在执行以下操作:
1。)生成结果集。 2.)打印结果(测试) 3.)使用结果集作为参数调用func2()。
在func2()中,当我试图迭代从func1()接收的结果集时,我遇到了错误。
当我删除func1()中的代码(步骤2)时,错误消失了!
答案 4 :(得分:0)
要解决内存不足问题,我必须设置我的代码,如下所示,在循环结束时检查loop == LocationCount然后打破循环。如果我把它遗漏了它会[rs next]然后会给我错误调用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];
}
}
答案 5 :(得分:0)
在上次调用[rs next]
返回[rs next]
后错误地调用false
时,我遇到了这个错误。