您声明了 3 次相同的字符串,但我认为这只是您问题中的一个错字,而您真正拥有(或至少意味着)的是:
NSString* string1 = @"String1";
NSString* string2 = @"String2";
NSString* string3 = @"String3";
您的下一个问题是您已将变量名称作为文字字符串包含在 " 中 - 这意味着 SQL 语句将包含“string1”而不是您所追求的 string1 的值。
由于您使用 SQLite 的包装器,因此您可以使用 stringWithFormat 创建插入语句,并替换字符串变量的值
NSString *sqlStatement=[NSString stringWithFormat:@"INSERT INTO LOG(NAME, COMPANY,CATEGORY) values (\"%@\",\"%@\",\"%@\")",string1,string2,string3];
int DBID = [_db ExecuteINSERT:sqlStatement];
值得注意的是,这是不安全的,因为您无法防范 SQL injection 从用户输入中获取值。这在移动设备上可能不是问题;用户能做的最糟糕的事情就是影响他们自己的数据库。
如果您不使用包装器,技术上正确的方法是使用 sqlite3_prepare_v2 -
sqlite3_stmt *statement;
NSString *insertSQL = @"INSERT INTO LOG(NAME, COMPANY,CATEGORY) values (?,?,?)";
const char *insert_stmt = [insertSQL UTF8String];
if (sqlite3_prepare_v2(_db, insert_stmt,-1, &statement, NULL)!= SQLITE_OK) {
// LOG THE ERROR
NSLog(@"Error: failed to perpare statement with message '%s'.", sqlite3_errmsg(_db));
}
else {
// Bind values to the statement
sqlite3_bind_text(statement,1,[string1 UTF8String],-1,SQLITE_TRANSIENT);
sqlite3_bind_text(statement,2,[string2 UTF8String],-1,SQLITE_TRANSIENT);
sqlite3_bind_text(statement,3,[string3 UTF8String],-1,SQLITE_TRANSIENT);
double retValue = sqlite3_step(statement);
if (retValue == SQLITE_DONE) {
NSLog(@"Insert successful");
}
sqlite3_reset(statement);
sqlite3_finalize(statement);
}
第二个代码块创建一个包含三个占位符(?,?,?) 的语句,然后用sqlite3_bind_text 将字符串替换为这些占位符。最后用 sqlite3_step 执行语句。
最后几行刚刚清理完毕。