首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iphone上的Sqlite“近”语法错误

iphone上的Sqlite“近”语法错误
EN

Stack Overflow用户
提问于 2013-10-17 13:39:21
回答 3查看 5.6K关注 0票数 0

我正在我的iphone应用程序中尝试使用sqlite来解决一个问题。读取部分是可以的,但是当我尝试使用UPADATE命令写入数据库时(我也尝试使用INSERT ),sql语句会返回错误sqlite3_errmsg:

代码语言:javascript
运行
复制
Failed. Error is:  near "UP": syntax error

守则是:

代码语言:javascript
运行
复制
-(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的。

有人能帮帮我吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-17 14:19:14

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

SQLITE_OPEN_READWRITE的值为2,因此您要声明查询只有两个字节长,这不是真的。

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

代码语言:javascript
运行
复制
sqlite3_prepare_v2(_database, [query UTF8String], -1, &statement, nil);

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

顺便说一句--始终检查sqlite3_prepare_v2的返回值,并确保它返回SQLITE_OK

票数 3
EN

Stack Overflow用户

发布于 2013-10-17 13:42:51

试着用这个方法。

您的数据库未打开。有关如何正确打开该方法的示例,请参阅此方法。

代码语言:javascript
运行
复制
-(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");
    }
}
票数 1
EN

Stack Overflow用户

发布于 2013-10-17 13:46:06

代码语言:javascript
运行
复制
         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";
        }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19428336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档