2011-12-22 126 views
8

我使用FMDB包裝我用如何解決錯誤調用sqlite3_step(21:內存不足)RS在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

如何解決這個問題

+2

您是如何解決這個問題的?我看到你的答案是正確的,但我想知道你做了什麼,因爲我有同樣的問題。你是否解決了這個問題,或者你是否切換到核心數據? – Fellowsoft 2013-04-23 13:50:21

回答

5

檢查的[rs close];

可能是它正在釋放或關閉數據庫。

============================================== =====

更好地使用CoreData在你的應用程序中實現sqlite。

爲什麼在應用程序中有更好的內部庫時使用外部庫。你不需要刪除你的sqlite表。您可以輕鬆地將現有數據庫遷移到CoreData。

0

即使[rs關閉]之後,我的內存已經不足了;所以我用:

while ([rs next]) { 
     @autoreleasepool 
     { 
      //stuff like......[rs stringForColumn:@"category_id"];... 
     } 
       } 
     [rs close]; 

我解決了我的血管增長以及內存不足的錯誤。

謝謝

0

我正面臨同樣的錯誤。所以基本上我有兩個函數,說func1()和func2()。

在func1的()我在做以下:

1)生成結果集。 2.)打印結果(測試) 3.)以結果集作爲參數調用func2()。

在func2()中,當我嘗試遍歷從func1()接收到的結果集時,我遇到了錯誤。

當我刪除func1()(第2步)中的代碼時,錯誤消失了!

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下一頁]

FMDatabase *db; 

[db open]; 

FMResultSet *set = [db executeQuery:@"some select"]; 

while ([set next]) 
{ 
    // no error 
} 

[set close]; 
[db close]; 
0

要解決內存不足的問題,我不得不把我的代碼像下面的循環結束檢查如果循環== LocationCount然後打破循環。如果我把它遺忘了,它會[rs next]然後給我錯誤調用sqlite3_step(21:內存不足)rs。 我會建議做類似的事情,所以[rs next]不會超過你的函數所要求的。

int loop = 0; 
while ([rs next]) 
    { 
     // additional code here 
     loop = loop + 1; 
     if (loop == LoopMaxCount) { 
       break; 
     } else { 
       [rs next]; 
     } 
    }