Môžem tieto dva dotazy nejako skombinovať?
Dostávam chybu tabuľky, ktorá sa nenašla v druhom dotaze, a myslím, že to súvisí s niektorými volaniami sqlite v prvom dotaze.
NSString *dayName = del.dayName;
int rowCount = del.tableRowNumber;
NSString *sqLiteDb = [[NSBundle mainBundle] pathForResource:@"banklist" ofType:@"sqlite3"];
if(sqlite3_open([sqLiteDb UTF8String], &_database) == SQLITE_OK)
{
NSString *sqlStatement = [NSString stringWithFormat:@"UPDATE %@ SET recipe_name="%@" WHERE cell_id="%i"",dayName, info.name, rowCount];
sqlite3_stmt *compiledStatement;
if(sqlite3_prepare_v2(_database, [sqlStatement UTF8String] , -1, &compiledStatement, NULL) == SQLITE_OK)
{
sqlite3_bind_text( compiledStatement, 1, [sqLiteDb UTF8String], -1, SQLITE_TRANSIENT);
}
if(sqlite3_step(compiledStatement) != SQLITE_DONE )
{
NSLog( @"Save Error: %s", sqlite3_errmsg(_database) );
}
else
{
sqlite3_reset(compiledStatement);
}
sqlite3_finalize(compiledStatement);
NSString *sqlStatement2 = [NSString stringWithFormat:@"UPDATE %@ SET recipe_id = (SELECT key FROM recipes WHERE name = Monday.recipe_name)",dayName];
sqlite3_stmt *compiledStatement2;
if(sqlite3_prepare_v2(_database, [sqlStatement2 UTF8String] , -1, &compiledStatement2, NULL) == SQLITE_OK)
{
sqlite3_bind_text( compiledStatement2, 1, [sqLiteDb UTF8String], -1, SQLITE_TRANSIENT);
}
if(sqlite3_step(compiledStatement2) != SQLITE_DONE )
{
NSLog( @"Save Error: %s", sqlite3_errmsg(_database) );
}
else
{
sqlite3_reset(compiledStatement2);
}
sqlite3_finalize(compiledStatement2);
}
sqlite3_close(_database);
Vďaka
odpovede:
1 pre odpoveď č. 1Niekoľko pozorovaní:
Možno nebudete chcieť zadať parametre do svojho dotazu pomocou
stringWithFormat
. Čo keby bol recept „Pat's Infamous Cookies“? Tento apostrof by sa interpretoval ako ukončenie vášho reťazca a vaša funkcia prípravy by zlyhala. Mali by ste použiť?
zástupné symboly vo vašich hodnotách SQL a väzbe. Pozri oddiel 3 dokumentácie k SQLite.Aj keď navrhujem použiť
sqlite3_bind_text
vyššie, skutočne volátesqlite3_bind_text
a odovzdať mu cestu k databázovému súboru. Tovzhľadom na váš SQL nedáva zmysel, pretože žiadne nemáte
?
zástupné symboly, s ktorými bude táto hodnota viazaná; aNie som si istý, prečo mu vôbec odovzdávate cestu k databáze.
Zdá sa, že toto volanie pravdepodobne nefunguje. Ak skontrolujete návratový kód existujúceho
sqlite_bind_text
Zavolajte, stavím sa, že nieSQLITE_OK
.Ak tvoj
sqlite3_prepare_v2
hovory zlyhajú (a toto je bežný bod zlyhania, keď „zdokonaľujete svoj SQL“), neprihlasujete sasqlite3_errmsg
,sqlite3_errmsg
dostanete po asqlite3_prepare_v2
zlyhanie je jednou z najužitočnejších chybových správ, ktoré dostanete (presne vám povie, čo je s vašim SQL zlé). Nezabudnite preskúmaťsqlite3_errmsg
aksqlite3_prepare_v2
sa nevrátiSQLITE_OK
.
To by mohlo viesť k:
if(sqlite3_open([sqLiteDb UTF8String], &_database) == SQLITE_OK)
{
NSString *sqlStatement = [NSString stringWithFormat:@"UPDATE %@ SET recipe_name=? WHERE cell_id=?",dayName];
sqlite3_stmt *compiledStatement;
if(sqlite3_prepare_v2(_database, [sqlStatement UTF8String] , -1, &compiledStatement, NULL) != SQLITE_OK)
{
NSLog(@"%s: prepare failed: %s", __FUNCTION__, sqlite3_errmsg(_database));
sqlite3_close(_database);
return;
}
if (sqlite3_bind_text( compiledStatement, 1, [info.name UTF8String], -1, SQLITE_TRANSIENT) != SQLITE_OK)
{
NSLog(@"%s: bind_text failed: %s", __FUNCTION__, sqlite3_errmsg(_database));
sqlite3_finalize(compiledStatement);
sqlite3_close(_database);
return;
}
if (sqlite3_bind_int( compiledStatement, 2, rowCount) != SQLITE_OK)
{
NSLog(@"%s: bind_int failed: %s", __FUNCTION__, sqlite3_errmsg(_database));
sqlite3_finalize(compiledStatement);
sqlite3_close(_database);
return;
}
if (sqlite3_step(compiledStatement) != SQLITE_DONE )
{
NSLog(@"Save Error: %s", sqlite3_errmsg(_database) );
sqlite3_finalize(compiledStatement);
sqlite3_close(_database);
return;
}
// you don"t need this unless you"re going to reuse that prepared statement, which you aren"t
//
//else
//{
// sqlite3_reset(compiledStatement);
//}
sqlite3_finalize(compiledStatement);
// did you really mean to hardcode "Monday" in this SQL?
NSString *sqlStatement2 = [NSString stringWithFormat:@"UPDATE %@ SET recipe_id = (SELECT key FROM recipes WHERE name = Monday.recipe_name)",dayName];
sqlite3_stmt *compiledStatement2;
if(sqlite3_prepare_v2(_database, [sqlStatement2 UTF8String] , -1, &compiledStatement2, NULL) != SQLITE_OK)
{
NSLog(@"%s: prepare 2 failed: %s", __FUNCTION__, sqlite3_errmsg(_database));
sqlite3_close(_database);
return;
}
if(sqlite3_step(compiledStatement2) != SQLITE_DONE )
{
NSLog( @"Save 2 Error: %s", sqlite3_errmsg(_database) );
}
// again, not needed
//
//else
//{
// sqlite3_reset(compiledStatement);
//}
sqlite3_finalize(compiledStatement2);
}
sqlite3_close(_database);
Musím sa priznať, že nie som blázon do dátového modelu, kde budujete SQL a dynamicky dodávam názvy tabuliek. Radšej by som videl jediný stôl so všetkými dňami a urobil dayName
stĺpec v tejto tabuľke. Ale to, čo máte, by malo fungovať, ale je to len neobvyklá konštrukcia.
1 pre odpoveď č. 2
Možno máte chybu v tejto časti vyhlásenia:
SELECT key
FROM recipes
WHERE name = Monday.recipe_name