Der benannte Fehler hat mich die letzten Tage produktive Arbeitszeit gekostet. Es kann verschiedene Ursachen haben einen solchen Fehler zu erhalten:
2011-01-27 08:54:53.427 App[536:207] <FMDatabase: 0x4b372c0> executeUpdate: BEGIN EXCLUSIVE TRANSACTION;
2011-01-27 08:54:53.428 App[536:207] <FMDatabase: 0x4b372c0> executeUpdate: INSERT INTO `bankContact` (`col1`, `col2`, `col3`, `col4`) VALUES (?, ?, ?, ?);
2011-01-27 08:54:53.429 App[536:207] obj: 1234
2011-01-27 08:54:53.430 App[536:207] obj: 5678
2011-01-27 08:54:53.431 App[536:207] obj: foo
2011-01-27 08:54:53.433 App[536:207] obj: bar
2011-01-27 08:54:53.436 App[536:207] Unknown error calling sqlite3_step (19: constraint failed) eu
2011-01-27 08:54:53.437 App[536:207] DB Query: INSERT INTO `tbl1` (`col1`, `col2`, `col3`, `col4`) VALUES (?, ?, ?, ?);
Gehen wir von diesem (Objective-C)-Quellcode aus:
self.db = [[FMDatabase alloc] init];
[self.db open];
[self.db setTraceExecution:true];
[self.db beginTransaction];
if (![self.db executeUpdate:@"INSERT INTO `tbl1` (`col1`, `col2`, `col3`, `col4`) VALUES (?, ?, ?, ?);",
[NSNumber numberWithInt:1234], [NSNumber numberWithInt:5678], @"foo", @"bar"
]) {
NSAssert(0, @"Failure - i'm not able to save a new row.");
}
[self.db commit];
[self.db close];
[self.db release];
Der SQL-Befehl ist ja bereits ersichtlich und scheint Fehlerfrei zu sein. Vorrausgesetzt, unsere Datentypen stimmen mit denen des CREATE-Statements überein. Die Datenbankstruktur hat in unserem Fall NUMERIC und VARCHAR-Felder. Wir übergeben für die richtigen Spalten die richtigen Werte. Wenn wir in VALUES den falschen Datentyp übergeben würden, könnte solch ein Fehler erscheinen. Wenn wir jedoch zwei primary keys definieren (zB. col1 & col2) und dann versuchen eine zweite Zeile einzufügen, die bereits gleiche Werte beinhaltet, so kommen wir auch zum obigen Fehler. Man sollte daher NIE NIE NIEmals vergessen, dass man primary keys definiert hat.
Es ist also wahrlich alles, nur keine triviale Fehlermeldung. SQLite3 könnte hier durchaus etwas nachbessern