2011-01-03 2 views
0

In meiner Kakao-Anwendung führe ich eine SQLite db im Ressourcen-Ordner und versuche, einige Auswahl, löschen Sie Operationen in ihm, aber nach einiger Zeit beginnt es mir "Datenbank ist gesperrt" -Fehler.Sqlite3: "Datenbank ist gesperrt" Fehler

Die Methoden, die ich für ausgewählte Löschvorgänge bin mit lauten wie folgt:

// Methode zum Abrufen von Daten

if (sqlite3_open([databasePath UTF8String], &database) != SQLITE_OK) 
     { 
      sqlite3_close(database); 
      NSAssert(0, @"Failed to open database"); 
     } 

     NSLog(@"mailBodyFor:%d andFlag:%d andFlag:%@",UId,x,Ffolder); 
     NSMutableArray *recordsToReturn = [[NSMutableArray alloc] initWithCapacity:2]; 
     NSString *tempMsg; 


     const char *sqlStatementNew; 
     NSLog(@"before switch"); 
     switch (x) { 
      case 9: 
      // tempMsg=[NSString stringWithFormat:@"SELECT * FROM users_messages"]; 
       tempMsg=[NSString stringWithFormat:@"SELECT message,AttachFileOriName as oriFileName,AttachmentFileName as fileName FROM users_messages WHERE id = (select message_id from users_messages_status where id= '%d')",UId]; 
       NSLog(@"mail body query - %@",tempMsg); 
       break; 
      default: 
       break; 
     } 
     sqlStatementNew = [tempMsg cStringUsingEncoding:NSUTF8StringEncoding]; 
     sqlite3_stmt *compiledStatementNew; 

     NSLog(@"before if statement"); 
     if(sqlite3_prepare_v2(database, sqlStatementNew, -1, &compiledStatementNew, NULL) == SQLITE_OK) { 
      NSLog(@"the sql is finalized"); 
      while(sqlite3_step(compiledStatementNew) == SQLITE_ROW) { 
       NSMutableDictionary *recordDict = [[NSMutableDictionary alloc] initWithCapacity:3]; 

       NSString *message; 
       if((char *)sqlite3_column_text(compiledStatementNew, 0)){ 
        message = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatementNew, 0)]; 
       } 
       else{ 
        message = @""; 
       } 
       NSLog(@"message - %@",message); 

       NSString *oriFileName; 
       if((char *)sqlite3_column_text(compiledStatementNew, 1)){ 
        oriFileName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatementNew, 1)]; 
       } 
       else{ 
        oriFileName = @""; 
       } 
       NSLog(@"oriFileName - %@",oriFileName); 

       NSString *fileName; 
       if((char *)sqlite3_column_text(compiledStatementNew, 2)){ 
        fileName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatementNew, 2)]; 
       } 
       else{ 
        fileName = @""; 
       } 
       NSLog(@"fileName - %@",fileName); 

       [recordDict setObject:message forKey:@"message"]; 
       [recordDict setObject:oriFileName forKey:@"oriFileName"]; 
       [recordDict setObject:fileName forKey:@"fileName"]; 

       [recordsToReturn addObject:recordDict]; 
       [recordDict release]; 
      } 

      sqlite3_finalize(compiledStatementNew); 
      sqlite3_close(database); 
      NSLog(@"user messages return -%@",recordsToReturn); 

      return recordsToReturn; 
     } 
     else{ 
      NSLog(@"Error while creating retrieving mailBodyFor in messaging '%s'", sqlite3_errmsg(database)); 
      sqlite3_close(database); 

     } 

// Methodendaten

if (sqlite3_open([databasePath UTF8String], &database) != SQLITE_OK) 
    { 
     sqlite3_close(database); 
     NSAssert(0, @"Failed to open database"); 
    } 

    NSString *deleteQuery = [[NSString alloc] initWithFormat:@"delete from users_messages_status where id IN(%@)",ids]; 
    NSLog(@"users_messages_status msg deleteQuery - %@",deleteQuery); 

    sqlite3_stmt *deleteStmnt; 
    const char *sql = [deleteQuery cStringUsingEncoding:NSUTF8StringEncoding]; 

    if(sqlite3_prepare_v2(database, sql, -1, &deleteStmnt, NULL) != SQLITE_OK){ 
     NSLog(@"Error while creating delete statement. '%s'", sqlite3_errmsg(database)); 
    } 
    else{ 
     NSLog(@"successful deletion from users_messages"); 
    } 

    if(SQLITE_DONE != sqlite3_step(deleteStmnt)){ 
     NSLog(@"Error while deleting. '%s'", sqlite3_errmsg(database)); 
    } 

    sqlite3_close(database); 

Dinge zu löschen sind geht in dieser Reihenfolge falsch

  1. Daten werden abgerufen
  2. Beim Ausführen des Löschvorgangs tritt der Fehler 'Datenbank ist gesperrt' auf.
  3. Wenn ich versuche, den ersten Schritt auszuführen .. es gibt jetzt denselben Fehler.

Kann mir jemand empfehlen:

  1. Wenn ich etwas falsch oder etwas Scheck tue fehlt?
  2. Gibt es eine Möglichkeit, es zu entsperren, wenn es gesperrten Fehler gibt?

Danke,

Miraaj

+0

Verwenden Sie [FMDB] (http://github.com/ccgus/fmdb). Es erleichtert den Umgang mit SQLite-Datenbanken erheblich. –

Antwort

1

Es ist wirklich ungewöhnlich, dass Öffnen/Schließen der Datenbank jedes Mal, wenn Sie zugreifen.

Wenn es Ihr beabsichtigtes Szenario ist, wäre es viel besser, eine normale Datei zu verwenden.

Öffnen Sie die Datenbank beim Start und schließen Sie sie beim Beenden. Dies könnte all Ihre Probleme lösen.

+0

hi 9dan ... danke für deine Antwort :) Ich habe getan, was du vorgeschlagen hast - db öffnen, wenn die Anwendung gestartet wird und es schließt, wenn die Anwendung beendet wird, aber jetzt gibt es diese Fehlermeldung, wenn ich versucht habe, einige Daten abzurufen - ' Bibliotheksroutine, die außerhalb der Reihenfolge aufgerufen wird. Können Sie mir eine Lösung vorschlagen? – Devarshi

+0

@Miraaj gut, jedes zufällige Problem des Threading? Überprüfen Sie die SQLite-FAQ zur Threadsicherheit: http://www.sqlite.org/faq.html#q6 – 9dan