Datenbank ist gesperrt in Sqlite
Ich bin die Entwicklung einer iPhone-app, wenn ich für das einfügen von Daten in die Datenbank hab ich "Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error while inserting data. 'database is locked''" Error.
Der code ist :
- (NSString *) getDBPath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *documentsDir = [paths objectAtIndex:0];
return [documentsDir stringByAppendingPathComponent:@"Halal.sqlite"];
}
+ (void) finalizeStatements {
if (database) sqlite3_close(database);
if (deleteStmt) sqlite3_finalize(deleteStmt);
if (addStmt) sqlite3_finalize(addStmt);
if (detailStmt) sqlite3_finalize(detailStmt);
if (updateStmt) sqlite3_finalize(updateStmt);
}
- (void) gettingData:(NSString *)dbPath {
NSLog(@"Data base path is %@",dbPath);
if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK)
{
const char *sql = "select * from Product";
sqlite3_stmt *selectstmt;
if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK)
{
while(sqlite3_step(selectstmt) == SQLITE_ROW)
{
[membersInfoDict setValue:[NSString stringWithUTF8String:(char*)sqlite3_column_text(selectstmt, 0)] forKey:@"ProductName"];
[membersInfoDict setValue:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)] forKey:@"ProductBarcode"];
[membersInfoDict setValue:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)] forKey:@"ProductImage"];
[membersInfoDict setValue:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 3)] forKey:@"ProductIngredients"];
[membersInfoDict setValue:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 4)] forKey:@"ProductStatus"];
if(membersInfoDict)
{
[membersInfoArray addObject:membersInfoDict];
membersInfoDict = nil;
// NSLog(@"Entered and return");
return;
}
}
}
}
else
sqlite3_close(database); //Even though the open call failed, close the database connection to release all the memory.
}
- (void) addRecord:(NSMutableDictionary *)recordDict
{
if (sqlite3_close(database))
{
NSLog(@"Closed");
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
[self gettingData:[documentsDir stringByAppendingPathComponent:@"Halal.sqlite"]];
}
else {
NSLog(@"Not Closed");
}
if(addStmt == nil) {
const char *sql = "insert into Product(ProductName, ProductBarcode , ProductImage,ProductIngredients,ProductStatus ) Values(?,?,?,?,?)";
if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)
NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
}
sqlite3_bind_text(addStmt, 1, [[recordDict objectForKey:@"ProductName"] UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(addStmt, 2, [[recordDict objectForKey:@"ProductBarcode"] UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(addStmt, 3, [[recordDict objectForKey:@"ProductImage"] UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(addStmt, 4, [[recordDict objectForKey:@"ProductIngredients"] UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(addStmt, 5, [[recordDict objectForKey:@"ProductStatus"] UTF8String], -1, SQLITE_TRANSIENT);
if(SQLITE_DONE != sqlite3_step(addStmt))
NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
else
//SQLite provides a method to get the last primary key inserted by using sqlite3_last_insert_rowid
rowID = sqlite3_last_insert_rowid(database);
NSLog(@"last inserted rowId = %d",rowID);
//Reset the add statement.
sqlite3_reset(addStmt);
//sqlite3_commit_hook();
//sqlite3_commit_hook(addStmt,[NSString stringWithFormat:@"%d",rowID],database);
}
Bitte geben Sie mir Lösung dafür.
Vielen Dank...
wo Sie öffnen, [ "Datenbank" sqlite3* ] und gibt es eine andere Abfrage, die Sie verwendet haben, und es bleibt dieser offen?
ich bin die Datenbank öffnen, beim anzeigen der details
ich bin die Datenbank öffnen, beim anzeigen der details
InformationsquelleAutor Anand | 2011-04-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Suche Kommentar
//ADD THIS LINE TO YOUR CODE
im folgenden modifizierten Methode von Euch.Dank Vincent
sollten Sie in der Nähe der db jedes mal, wenn Sie auf Sie zugreifen? Außerdem benutze ich eine Methode [self openDB] zum öffnen der DB. Spielt es eine Rolle, dass ich zu trennen, die Funktionalität oder sollte ich tun, jede Sache in der gleichen Stelle. Es scheint, wie es sollte keine Rolle spielen.
Nein, es ist nicht notwendig, schließen Sie die dbase-jedes mal. Aber es ist "gut Programmieren" zu haben, dbase, offene und/oder gesperrt werden so kurz wie möglich.
Hinzufügen der sqlite3_finalize(selectstmt); rechts oben die sqlite3_close(Datenbank); arbeitete für mich.
InformationsquelleAutor rptwsthi
müssen Sie schließen Sie die kompilierten Anweisungen und schließen Sie die Datenbank vor dem öffnen es wieder.
InformationsquelleAutor Saurabh
Den oben genannten Antworten sind richtig, jedoch gibt es einen Weg, aus der Datenbank den Fehler anzeigen gesperrt werden, wenn wir arbeiten oder Debuggen auf Simulatoren.
Fall 1:
Hier bin ich erklären ein Szenario, wenn ich Daten in eine Tabelle einfügen. Und die Datenbank ist der Zugriff auf die von beliebigen Datenbank-browser und Zugriff auf die vom simulator.
Nun, wenn Sie arbeiten via app-simulator, Wie Sie die Daten gespeichert in der Datenbank gespeicherten Daten. Nun, Wenn Sie mit einem beliebigen browser für den Zugriff auf die Daten der Datenbank und wenn Sie Schießen, werden alle update-Befehl in Ihrem browser und versuchen Sie, aktualisieren Sie jede Zeile, die es updates, die Zeile in eine Tabelle. (Nun, wenn wir versuchen, alles löschen von der Tabelle es zeigt immer eine Meldung, dass im browser nur-lese-Berechtigungen, etc).
Nun kommen Sie auf simulator oder Wenn man die app wieder
und wenn Sie versuchen, einfügen aller Daten in dieser Tabelle, Es zeigt immer Fehlermeldung "Datenbank ist gesperrt", da die Berechtigungen nur Lesen, und wir vergütet diese Berechtigungen. Nun, Wenn Sie versuchen, ändern Sie Befehle wie erwähnt in den Antworten wird immer wieder Traurigkeit. Es zeigt immer ein Fehler der Datenbank gesperrt ist (Wie ich schon einige Male um dieses Problem zu lösen, aber jedes mal habe ich versagt).
Es ist nur ein Weg, um entfernen aus dieser situation ist: entfernen Sie die app aus dem simulator, und installieren Sie es.
Und vermeiden Sie zu aktualisieren/einfügen einer Zeile vom browser.
Einer weiteren Antwort:
Fall 2:
Wie Sie arbeiten, auf sqlite-browser und alle updations von es, sicherzustellen, dass Sie gespeichert haben, werden alle Ihre änderungen anderen Weise gesperrten Zustand passiert.
InformationsquelleAutor Gourav Joshi