Ich habe zwei Methoden in einer DB-Helper-Klasse, die im Grunde die gleiche Sache für zwei verschiedene Datenbank-Entitäten tun, und ich möchte sie umzuformen, um zu vermeiden, Code zu duplizieren.Wie Refactor dieses Objective-C-Code
Die erste Einheit:
- (void) insertOrUpdateEntityA:(NSDictionary*)data {
sqlite3_stmt *exists_stmt;
if(sqlite3_prepare_v2(database, RMSQLEntityAExists, -1, &exists_stmt, NULL) == SQLITE_OK) {
[RMStoreDB bindPrimaryKey:exists_stmt data:data from:1];
if (sqlite3_step(exists_stmt) == SQLITE_ROW) {
int count = sqlite3_column_int(exists_stmt, 1);
sqlite3_stmt *update_stmt;
if (count) { // Update
if (sqlite3_prepare_v2(database, RMSQLEntityAUpdate, -1, &update_stmt, NULL) == SQLITE_OK) {
int index = [RMStoreDB bindEntityA:update_stmt data:data from:1];
[RMStoreDB bindPrimaryKey:update_stmt data:data from:index];
}
} else { // Insert
if (sqlite3_prepare_v2(database, RMSQLEntityAInsert, -1, &update_stmt, NULL) == SQLITE_OK) {
int index = [RMStoreDB bindPrimaryKey:update_stmt data:data from:1];
[RMStoreDB bindEntityA:update_stmt data:data from:index];
}
}
sqlite3_step(update_stmt);
sqlite3_finalize(update_stmt);
}
}
sqlite3_finalize(exists_stmt);
}
die zweite Einheit:
- (void) insertOrUpdateEntityB:(NSDictionary*)data {
sqlite3_stmt *exists_stmt;
if(sqlite3_prepare_v2(database, RMSQLEntityBExists, -1, &exists_stmt, NULL) == SQLITE_OK) {
[RMStoreDB bindPrimaryKey:exists_stmt data:data from:1];
if (sqlite3_step(exists_stmt) == SQLITE_ROW) {
int count = sqlite3_column_int(exists_stmt, 1);
sqlite3_stmt *update_stmt;
if (count) { // Update
if (sqlite3_prepare_v2(database, RMSQLEntityBUpdate, -1, &update_stmt, NULL) == SQLITE_OK) {
int index = [RMStoreDB bindEntityB:update_stmt data:data from:1];
[RMStoreDB bindPrimaryKey:update_stmt data:data from:index];
}
} else { // Insert
if (sqlite3_prepare_v2(database, RMSQLEntityBInsert, -1, &update_stmt, NULL) == SQLITE_OK) {
int index = [RMStoreDB bindPrimaryKey:update_stmt data:data from:1];
[RMStoreDB bindEntityB:update_stmt data:data from:index];
}
}
sqlite3_step(update_stmt);
sqlite3_finalize(update_stmt);
}
}
sqlite3_finalize(exists_stmt);
}
Die Unterschiede sind die Konstanten für die SQL-Anweisungen verwendet (RMSQLEntityAExists
, RMSQLEntityBExists
, etc.) und die zur Bindung verwendete Methode die Daten zur SQLite-Anweisung (bindEntityA
und bindEntityB
). Letzteres ist das, was ich besonders verallgemeinern möchte.
Wie überarbeite ich diese beiden Methoden? Sollte ich?
Verwenden Sie [FMDB] (http://github.com/ccgus/fmdb). –
Aber dann würde ich nicht lernen, wie man diesen speziellen Code umgestaltet. ;) – hpique