在 iPhone 的 sqlite 中获取更新语句时出现问题

Posted

技术标签:

【中文标题】在 iPhone 的 sqlite 中获取更新语句时出现问题【英文标题】:Problem in getting a update statement firing in sqlite for iPhone 【发布时间】:2011-10-05 02:13:12 【问题描述】:

我在更新数据时遇到问题。我使用此代码进行更新。

这一切进展顺利,但我的数据没有更新。这有什么问题?

我想更新 EndDate 列的值:它的数据类型是 DATETIME。

一切都执行得很好,但我的数据库表 UserJourney 的 EndDate 没有得到更新是什么问题,我该如何解决?

-(void)journeyEnd


    NSString *filePath = [self getWritableDBPath];

    sqlite3 *database;


    NSDate* date = [NSDate date];
    //Create the dateformatter object
    NSDateFormatter* formatter = [[[NSDateFormatter alloc] init] autorelease];
    //Set the required date format
    [formatter setDateFormat:@"yyyy-MM-dd HH:MM:SS"];
    //Get the End date
    NSString* str = [formatter stringFromDate:date];
    NSLog(@"this from new map '%@'",journeyid);

    if(sqlite3_open([filePath UTF8String], &database) == SQLITE_OK) 

**this line where i am trying to insert statement after that i remember that i have fire the UPDATE statement** 
        //const char *sqlStatement = "insert into UserJourney(EndDate) VALUES (?) where JourneyID = ''";
//And here I fire the Update statement 
        NSString *sqlStatement = [NSString stringWithFormat:@"UPDATE UserJourney SET EndDate='%@' WHERE JourneyID='%@'",str,journeyid]; 
            sqlite3_stmt *compiledStatement;
        if(sqlite3_prepare_v2(database, [sqlStatement UTF8String] , -1, &compiledStatement, NULL) == SQLITE_OK)    

            sqlite3_bind_text( compiledStatement, 1, [str UTF8String], -1, SQLITE_TRANSIENT);

        
        if(sqlite3_step(compiledStatement) != SQLITE_DONE ) 
            NSLog( @"Save Error: %s", sqlite3_errmsg(database) );
        
        else 
            sqlite3_reset(compiledStatement);
            UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"UIAlertView" message:@"Record added" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alert show];
            [alert release];
            alert = nil;

        

        sqlite3_finalize(compiledStatement);
    
    sqlite3_close(database);    


【问题讨论】:

数据库中的 JournyID 是否为 Text 数据类型? 没有什么可以绑定的,因为你没有使用参数化查询,那你为什么要绑定 sqlite3_bind_text? @jignesh NO JourneyID 是 VARCHARPRIMARY KEY 尝试评论这一行 sqlite3_bind_text(compiledStatement, 1, [str UTF8String], -1, SQLITE_TRANSIENT); No It's not working my firend.Ok 你的意思是说在更新语句中我们不能使用绑定行是正确的 【参考方案1】:

尝试通过替换以下方法。我做了几个改变。它可能会有所帮助。如果不起作用,您可以发布您的数据库表列数据类型吗?

-(void)journeyEnd


NSString *filePath = [self getWritableDBPath];

sqlite3 *database;


NSDate* date = [NSDate date];
//Create the dateformatter object
NSDateFormatter* formatter = [[[NSDateFormatter alloc] init] autorelease];
//Set the required date format
[formatter setDateFormat:@"yyyy-MM-dd HH:MM:SS"];
//Get the End date
NSString* str = [formatter stringFromDate:date];
NSLog(@"this from new map '%@'",journeyid);

if(sqlite3_open([filePath UTF8String], &database) == SQLITE_OK) 

**this line where i am trying to insert statement after that i remember that i have fire the UPDATE statement** 
    //const char *sqlStatement = "insert into UserJourney(EndDate) VALUES (?) where JourneyID = ''";
//And here I fire the Update statement 
        NSString *sqlStatement = [NSString stringWithFormat:@"UPDATE UserJourney SET EndDate='%@' WHERE JourneyID='%d'",str,journeyid]; 
        sqlite3_stmt *compiledStatement;
    if(sqlite3_prepare_v2(database, [sqlStatement UTF8String] , -1, &compiledStatement, NULL) == SQLITE_OK)    


    
    if(sqlite3_step(compiledStatement) != SQLITE_DONE ) 
        NSLog( @"Save Error: %s", sqlite3_errmsg(database) );
    
    else 
        sqlite3_reset(compiledStatement);
        UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"UIAlertView" message:@"Record added" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
        [alert release];
        alert = nil;

    

    sqlite3_finalize(compiledStatement);

sqlite3_close(database);    


希望对您有所帮助。

【讨论】:

它不起作用 Deeps 它是相同的代码,上面写的没有任何更改是由您删除的例外的slitw3_bind_text行完成的 我也将 %d 从 %@ 更改为 JourneyId。我还询问了您的表格的数据类型,以便获得更多想法。如果您的日期列数据类型是日期时间,那么它将不起作用。 比如何解决这个问题你的意思是说我必须将我的数据类型更改为文本或其他内容。为什么你不在这个中写绑定语句 临时您可以将数据类型更改为文本并检查以确保问题是由于数据类型引起的,并且不需要绑定函数,因为您没有任何需要绑定的参数。如果您的查询包含“?”那么您需要绑定该参数的值。在您的情况下,您已经有了日期和旅程 ID。让我知道您将日期列数据类型更改为文本后会发生什么。 将数据类型日期时间更改为文本后,即使它没有得到更新【参考方案2】:

你必须使用 updateStatement 而不是compiledStatement

【讨论】:

以上是关于在 iPhone 的 sqlite 中获取更新语句时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

在 iPhone 上更新 SQLite 数据库

在 Iphone 中使用 Core Data 从 SQLite 数据库中获取主键值

iPhone/Sqlite - 如何仅从服务器获取更改的数据?

SQLite 更改未保存

如何通过iphone中的sqlite获取路径来显示文档目录中保存的图像

当 iPhone 的 Appstore 上的应用程序版本更改时,sqlite 数据库更新