在iPhone上的Sqlite“近”语法错误

我在我的iphone应用程序中用sqlite试验一个问题。 阅读部分是好的,但是当我尝试写入数据库使用UPADATE命令(我也尝试使用INSERT),sql语句给我回错误sqlite3_errmsg:

Failed. Error is: near "UP": syntax error 

代码是:

 -(void)ratesInfotoDb:(NSString *)idx rate:(NSString*)rate{ query =@"UPDATE rules set rate = 5 where _id = 1994"; sqlite3_stmt *statement; sqlite3_prepare_v2(_database, [query UTF8String], SQLITE_OPEN_READWRITE, &statement, nil); if(sqlite3_step(statement) == SQLITE_DONE ) { NSLog(@"element added"); } else{ NSLog( @"Failed. Error is: %s", sqlite3_errmsg(_database)); } sqlite3_finalize(statement); sqlite3_close(_database); } 

查询命令“UPDATE rules set rate = 5 where _id = 1994”(直接在数据库上执行)工作,所以我想查询是corect。

任何人都可以帮我吗?

问题很简单。 您正在将错误的值传递给sqlite3_prepare_v2函数。 第三个参数应该表示查询string的长度。

macrosSQLITE_OPEN_READWRITE的值为2因此您声明查询只有2个字节长,这是不正确的。

将您的调用更改为sqlite3_prepare_v2 ,如下所示:

 sqlite3_prepare_v2(_database, [query UTF8String], -1, &statement, nil); 

传递-1告诉sqlite3_prepare_v2获取查询的实际长度(可能通过使用strlen )。

顺便说一句 – 总是检查sqlite3_prepare_v2的返回值,并确保它返回SQLITE_OK

尝试使用这种方法…

你的数据库没有打开。 看一下如何正确打开它的例子。

 -(void)executeQuery:(NSString *)query { sqlite3_stmt *statement; if(sqlite3_open([[self dataFilePath] UTF8String], &database) == SQLITE_OK) { if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_step(statement) != SQLITE_DONE) { sqlite3_finalize(statement); } } else { NSLog(@"query Statement Not Compiled"); } sqlite3_finalize(statement); sqlite3_close(database); } else { NSLog(@"Data not Opened"); } } 
  NSString *status; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); NSString *documentsDir = [paths objectAtIndex:0]; NSString *dbPath=[[NSString alloc]initWithString:[documentsDir stringByAppendingPathComponent:@"YOUR DATABASE NAME.sqlite"]]; NSLog(@"Database Path %@",dbPath); sqlite3_stmt *statement; if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) { NSLog(@"open"); NSString *updateSQL = [NSString stringWithFormat: @"UPDATE rules set rate = 5 where _id = 1994"]; const char *update_stmt = [updateSQL UTF8String]; sqlite3_prepare_v2(database, update_stmt, -1, &statement, NULL); if (sqlite3_step(statement) == SQLITE_DONE) { status=@" Updated"; } else { status=@"Error occured"; }