2011-12-22 6 views
8

estoy usando FMDB envoltorio i utilizado este códigocómo resolver un error llamando sqlite3_step (21: fuera de la memoria) rs en 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; 
} 

primera vez que trabaja muy bien

- (BOOL)update:(NSString *) Body fromValue:(NSString *)froms{ 
} 

método. en el segundo tiempo del bucle no está funcionando sqlite3_step llamando

de error (21: fuera de la memoria) rs

la forma de resolver este problema

+2

¿Cómo resolvió este problema? Veo que marcó una respuesta como correcta, pero me gustaría saber qué hizo, porque estoy teniendo el mismo problema. ¿Solucionó el problema o cambió a Datos básicos? – Fellowsoft

Respuesta

5

cheque por la [rs close];

Puede ser que esté liberando o cerrando la base de datos.

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

Mejor uso CoreData SQLite para implementar en su aplicación.

por qué utilizar biblioteca externa, cuando una mejor biblioteca interna está disponible en la aplicación. No necesita eliminar su tabla sqlite. Puede migrar fácilmente su base de datos existente a CoreData.

0

que estaba haciendo fuera de la memoria incluso después de [RS] cercanos; así que utilicé:

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

solucioné mi crecimiento de memoria así como el error de memoria.

Gracias

0

Me enfrentaba el mismo error. Así que, básicamente, tenía dos funciones, digamos func1() y func2().

En func1() que estaba haciendo lo siguiente:

1.) Generar el conjunto de resultados. 2.) Imprimir el resultado (Para probar) 3.) Llamar a func2() con el conjunto de resultados como argumento.

En func2(), que estaba enfrentando el error, mientras que yo estaba tratando de recorrer el conjunto de resultados recibidos de func1().

Cuando quité el código en func1() (Paso 2), el error se había ido!

3

que estaba recibiendo el mismo error, porque la llamada [base de datos de cerca] antes de la llamada [conjuntoResultados siguiente].

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]; 

deben llamar [base de datos de cerca] después de la llamada [conjuntoResultados siguiente]

FMDatabase *db; 

[db open]; 

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

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

[set close]; 
[db close]; 
0

Para resolver el cabo del problema de memoria, que tenía que poner mi código como el siguiente para comprobar en el final del bucle if loop == LocationCount luego rompa el ciclo. Si lo dejo, sería [rs next] que me daría el error de llamar a sqlite3_step (21: out of memory) rs. Recomendaría hacer algo similar para que [rs next] no lo haga más de lo requerido para su función.

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