2011-12-22 10 views
8

sto usando FMDB involucro ho usato questo codicecome risolvere l'errore di chiamare sqlite3_step (21: out of memory) rs in 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; 
} 

prima volta lavorando bene

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

metodo. nel ciclo seconda volta non funziona

errore sqlite3_step chiamando il numero (21: out of memory) rs

come risolvere questo problema

+2

Come hai risolto questo problema? Vedo che hai contrassegnato una risposta come corretta, ma mi piacerebbe sapere cosa hai fatto, perché ho lo stesso problema. Hai risolto il problema o sei passato a Core Data? – Fellowsoft

risposta

5

Verificare la [rs close];

Può essere che sta rilasciando o chiudendo il DB.

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

È consigliabile utilizzare CoreData per implementare sqlite nell'applicazione.

Perché utilizzare la libreria esterna, quando una migliore libreria interna è disponibile nell'applicazione. Non è necessario rimuovere la tabella sqlite. È possibile migrare facilmente il database esistente in CoreData.

0

stavo perdendo memoria anche dopo [rs close]; Così ho usato:

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

ho risolto la mia crescita Mory così come errore di memoria insufficiente.

Grazie

0

Mi trovavo di fronte lo stesso errore. Quindi fondamentalmente avevo due funzioni, ad esempio func1() e func2().

In FUNC1() stavo facendo quanto segue:

1.) Generare il set di risultati. 2.) Stampa del risultato (Per testare) 3.) Chiamare func2() con il risultato impostato come argomento.

In func2(), ero di fronte all'errore mentre stavo cercando di scorrere il set di risultati ricevuto da func1().

Quando ho rimosso il codice in func1() (Passaggio 2), l'errore era sparito!

3

Stavo ottenendo lo stesso errore perché chiamata [database close] prima della chiamata [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]; 

dovrebbe chiamare [database chiudi] dopo la chiamata [resultSet successiva]

FMDatabase *db; 

[db open]; 

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

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

[set close]; 
[db close]; 
0

Per risolvere il fuori problema di memoria, ho dovuto impostare il mio codice come qui di seguito per controllare alla fine del ciclo se il ciclo == LocationCount interrompe il ciclo. Se lo avessi lasciato sarebbe [rs next] che poi mi avrebbe dato l'errore chiamando sqlite3_step (21: out of memory) rs. Consiglierei di fare qualcosa di simile quindi [rs next] non è molto più di quanto richiesto per la tua funzione.

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