Как решить Ошибка вызова sqlite3_step (21: недостаточно памяти) rs в FMDB - PullRequest
8 голосов
/ 22 декабря 2011

Я использую обертку 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

как решить эту проблему

Ответы [ 5 ]

5 голосов
/ 22 декабря 2011

Проверьте для [rs close];

Может быть, это освобождение или закрытие БД.

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

Лучше использовать CoreData для реализации sqlite в вашем приложении.

Зачем использовать внешнюю библиотеку, если в приложении доступна лучшая внутренняя библиотека.Вам не нужно удалять таблицу sqlite.Вы можете легко перенести существующую базу данных в CoreData.

3 голосов
/ 02 июня 2016

Я получаю ту же ошибку, потому что вызываю [база данных закрывается] перед вызовом [resultSet next].

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];
0 голосов
/ 06 сентября 2017

Чтобы решить проблему нехватки памяти, мне пришлось установить свой код, как показано ниже, чтобы проверить в конце цикла, если цикл == 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];
         }
     }
0 голосов
/ 15 июня 2014

Я столкнулся с той же ошибкой. В общем, у меня было две функции, скажем, func1 () и func2 ().

В func1 () я делал следующее:

1.) Генерация набора результатов. 2.) Печать результата (для проверки) 3.) Вызов функции func2 () с результирующим набором в качестве аргумента.

В func2 () я столкнулся с ошибкой, пытаясь перебрать набор результатов, полученный от func1 ().

Когда я удалил код в func1 () (Шаг 2), ошибка исчезла!

0 голосов
/ 29 ноября 2013

мне не хватало памяти даже после [rs close];поэтому я использовал:

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

я решил мой рост памяти, а также ошибки нехватки памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...