/ / Поєднайте два запити sqlite3 - ios, object-c, sqlite

Поєднайте два запити sqlite3 - ios, aim-c, sqlite

Чи можу я поєднати ці два запити як?

Я отримую помилку таблиці, не знайденої у другому запиті, і я думаю, це пов’язано з деякими викликами 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

Пара спостережень:

  1. Можливо, ви не захочете надавати параметри запиту за допомогою stringWithFormat. Що робити, якщо рецептом було "Паскудні печива"? Цей апостроф буде інтерпретований як закінчення вашого рядка, і ваша функція підготовки не вдасться. Вам слід використовувати ? заповнювачі у вашому SQL та значення прив'язки. Побачити розділ 3 документації SQLite.

  2. Поки я пропоную вам використовувати sqlite3_bind_text функція вище, ви насправді телефонуєте sqlite3_bind_text і передаючи йому шлях до файлу бази даних. Це

    • не має сенсу, враховуючи ваш SQL, тому що у вас його немає ? заповнювачі, з якими пов’язують це значення; і

    • Я не впевнений, чому ви взагалі передаєте йому шлях до бази даних.

    Цей дзвінок, здається, не може спрацювати. Якщо ви перевірите код повернення цього існуючого sqlite_bind_text дзвоніть, я б ставлю, що це не так SQLITE_OK.

  3. Якщо ти sqlite3_prepare_v2 виклики не виконуються (і це є загальним пунктом відмови, коли ви "доопрацьовуєте SQL), ви не реєструєте sqlite3_errmsg. The sqlite3_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