Чи можу я поєднати ці два запити як?
Я отримую помилку таблиці, не знайденої у другому запиті, і я думаю, це пов’язано з деякими викликами sqlite у першому запиті.
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);
Дякую
Відповіді:
1 для відповіді № 1Пара спостережень:
Можливо, ви не захочете надавати параметри запиту за допомогою
stringWithFormat
. Що робити, якщо рецептом було "Паскудні печива"? Цей апостроф буде інтерпретований як закінчення вашого рядка, і ваша функція підготовки не вдасться. Вам слід використовувати?
заповнювачі у вашому SQL та значення прив'язки. Побачити розділ 3 документації SQLite.Поки я пропоную вам використовувати
sqlite3_bind_text
функція вище, ви насправді телефонуєтеsqlite3_bind_text
і передаючи йому шлях до файлу бази даних. Цене має сенсу, враховуючи ваш SQL, тому що у вас його немає
?
заповнювачі, з якими пов’язують це значення; іЯ не впевнений, чому ви взагалі передаєте йому шлях до бази даних.
Цей дзвінок, здається, не може спрацювати. Якщо ви перевірите код повернення цього існуючого
sqlite_bind_text
дзвоніть, я б ставлю, що це не такSQLITE_OK
.Якщо ти
sqlite3_prepare_v2
виклики не виконуються (і це є загальним пунктом відмови, коли ви "доопрацьовуєте SQL), ви не реєструєтеsqlite3_errmsg
. Thesqlite3_errmsg
ви отримуєте післяsqlite3_prepare_v2
Помилка - одне з найкорисніших повідомлень про помилки, яке ви отримаєте (воно точно вкаже, що не так із вашим SQL). Обов’язково обстежтеsqlite3_errmsg
якщоsqlite3_prepare_v2
не повертаєтьсяSQLITE_OK
.
Отже, це може дати:
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);
Я повинен визнати, що я "не божевільний щодо моделі даних, де ви будуєте SQL, динамічно подаючи імена таблиць. Я хотів би побачити єдину таблицю з усіма днями і зробити dayName
стовпець у цій таблиці. Але те, що у вас є, має працювати, але це просто незвичайна конструкція.
1 для відповіді № 2
Можливо, у вас є помилка в цій частині твердження:
SELECT key
FROM recipes
WHERE name = Monday.recipe_name