これらの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いくつかの観察:
を使用してクエリにパラメータを提供したくない場合があります
stringWithFormat
。レシピが「パットの悪名高いクッキー」だった場合はどうなりますか?そのアポストロフィは文字列を終了すると解釈され、準備機能は失敗します。使用する必要があります?
SQLのプレースホルダーとバインド値。見る セクション3 SQLiteドキュメントの。私はあなたが使用することを提案している間
sqlite3_bind_text
上記の関数、あなたは実際に呼び出していますsqlite3_bind_text
そしてそれにデータベースファイルへのパスを渡します。それあなたが持っていないので、あなたのSQLを考えると意味がありません
?
この値をバインドするプレースホルダー。そしてデータベースのパスを渡す理由がわかりません。
その呼び出しは、おそらく機能する可能性はないようです。既存の戻りコードを確認すると、
sqlite_bind_text
電話、私はそれがそうではないことを賭けますSQLITE_OK
.もしあなたの
sqlite3_prepare_v2
呼び出しは失敗します(これは、SQLを改良している間の一般的な失敗のポイントです)、ログに記録していませんsqlite3_errmsg
。ザsqlite3_errmsg
あなたは後に取得しますsqlite3_prepare_v2
失敗は、表示される最も有用なエラーメッセージの1つです(SQLの何が問題になっているのかを正確に教えてくれます)。必ず調べてくださいsqlite3_errmsg
ifsqlite3_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