如何解决在 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 时出错的主要内容,如果未能解决你的问题,请参考以下文章

FMDB 的多线程问题

如何写一个FMDB帮助类?看看runtime吧

JRDB:iOS对FMDB的超好用封装

如何在 IOS Swift 中使用 SQLite 使用 FMDB 处理多个线程

如何在 Swift 中使用“FMDB/SQLCipher”进行加密和解密?

如何在 swift 3 中使用现有的 SQLite? (FMDB)