准备语句(prepared statement)对象代表一个简单SQL语句对象的实例,这个对象通常被称为“准备语句”或者“编译好的SQL语句”或者就直接称为“语句”。
语句对象的生命周期经历这样的过程:
使用sqlite3_prepare_v2或相关的函数创建这个对象
使用sqlite3_bind_*()给宿主参数(host parameters)绑定值
通过调用sqlite3_step一次或多次来执行这个sql
使用sqlite3——reset()重置这个语句,然后回到第2步,这个过程做0次或多次
使用sqlite3_finalize()销毁这个对象
static const char *insert = "INSERT INTO xTest(firstValue, secondValue) VALUES (?, ?);";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(database, insert, -1, &stmt, NULL) == SQLITE_OK) {
for (int i = 0; i < 1000; ++i) {
sqlite3_bind_int(stmt, 1, i+1);
sqlite3_bind_int(stmt, 2, (i+1) * 2);
if (sqlite3_step(stmt) != SQLITE_DONE) {
--i;
NSLog(@"Error inserting table: %s", sqlite3_errmsg(database));
}
sqlite3_reset(stmt);
}
sqlite3_finalize(stmt);
}
宿主参数(host parameters)
在传给sqlite3_prepare_v2()的sql语句文本或者它的变量中,满足如下模板的文字将被替换成一个参数:
l ?
l ?NNN,NNN代表数字
l :VVV,VVV代表字符
l @VVV
l $VVV
在上面这些模板中,NNN代表一个数字,VVV代表一个字母数字标记符(例如:222表示名称为222的标记符),sql语句中的参数(变量)通过上面的几个模板来指定,如
“select ? from ? “这个语句中指定了两个参数,sqlite语句中的第一个参数的索引值是1,这就知道这个语句中的两个参数的索引分别为1和2,使用”?”的话会被自动给予索引值,而使用”?NNN”则可以自己指定参数的索引值,它表示这个参数的索引值为NNN。”:VVV”表示一个名为”VVV”的参数,它也有一个索引值,被自动指定。
可以使用sqlite3_bind_*()来给这些参数绑定值