/ / 2つのsqlite3クエリを組み合わせる-ios、objective-c、sqlite

2つのsqlite3クエリを組み合わせる-ios、objective-c、sqlite

これらの2つのクエリを何らかの方法で組み合わせることができますか?

2番目のクエリでテーブルが見つからないというエラーが発生しました。これは、最初のクエリでの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。ザ sqlite3_errmsg あなたは後に取得します sqlite3_prepare_v2 失敗は、表示される最も有用なエラーメッセージの1つです(SQLの何が問題になっているのかを正確に教えてくれます)。必ず調べてください sqlite3_errmsg if 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を構築し、テーブル名を動的に提供するデータモデルに夢中ではないことを告白しなければなりません。一日中1つのテーブルを見て、 dayName そのテーブルの列。しかし、あなたが持っているものはうまくいくはずですが、それはただの珍しい構成です。


回答№2の場合は1

ステートメントのこの部分にエラーがある可能性があります。

SELECT key
FROM recipes
WHERE name = Monday.recipe_name