/ / Spojte dva dotazy sqlite3 - ios, Objective-C, sqlite

Kombinujte dva dotazy sqlite3 - ios, object-c, sqlite

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ď č. 1

Niekoľko pozorovaní:

  1. 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.

  2. Aj keď navrhujem použiť sqlite3_bind_text vyššie, skutočne voláte sqlite3_bind_text a odovzdať mu cestu k databázovému súboru. To

    • vzhľadom na váš SQL nedáva zmysel, pretože žiadne nemáte ? zástupné symboly, s ktorými bude táto hodnota viazaná; a

    • Nie 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 nie SQLITE_OK.

  3. Ak tvoj sqlite3_prepare_v2 hovory zlyhajú (a toto je bežný bod zlyhania, keď „zdokonaľujete svoj SQL“), neprihlasujete sa sqlite3_errmsg, sqlite3_errmsg dostanete po a sqlite3_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 ak sqlite3_prepare_v2 sa nevráti SQLITE_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