2011-05-17 84 views
0

嗨,我写一个iPhone应用程序,需要sqlite和一个更新查询。所以,简单地说,为什么这个工程:Sqlite更新问题

NSString *query=[NSString stringWithFormat:@"%@%@%@%@%@", 
    @"UPDATE ZTABELLA SET ZTYPE =",@"1", 
    @" WHERE ZNAME='",@"stringaoggetto",@"';"]; 

sqlite3_exec(database2, [query UTF8String], NULL, NULL, NULL); 

,为什么这不工作:

NSString *query=[NSString stringWithFormat:@"%@%@%@%@%@", 
    @"UPDATE ZTABELLA SET ZTYPE =",@"1", 
    @" WHERE ZNAME='",oggetto,@"';"]; 

sqlite3_exec(database2, [query UTF8String], NULL, NULL, NULL); 

这两个例子的区别只在第一@"stringaoggetto"和第二oggetto。在第一个我直接插入一个字符串的值,在第二个例子中oggetto是一个nsstring对象,里面有正确的值(我打印了一个nslog)。为什么这个区别?

的日志查询是针对各实施例相同的:

NSLog(@" %@",query); 
//this log print: UPDATE ZTABELLA SET ZTYPE =1 WHERE ZNAME='stringaoggetto'; 

的日志NSString的对象“oggetto”是:

NSLog(@"%@",oggetto); 
//this log print stringaoggetto 

我也曾尝试另一个代码来检查错误,但结果是一样的:

if (sqlite3_open([dbPath2 UTF8String], &database2) == SQLITE_OK) { 


     const char *update = "UPDATE ZTABELLA SET ZTYPE =1 WHERE ZNAME=?"; 

     sqlite3_stmt *updatestmt; 
if(sqlite3_prepare_v2(database2, update, -1, &updatestmt, NULL) == SQLITE_OK) { 

sqlite3_bind_text(updatestmt, 1, [oggetto UTF8String] , -1, SQLITE_TRANSIENT); 


if(SQLITE_DONE != sqlite3_step(updatestmt)){ 

    NSAssert1(0, @"Error while updating. '%s'", sqlite3_errmsg(database2)); 

       } 
sqlite3_reset(updatestmt);     

      } 
      else { 
       NSAssert1(0, @"Error while creating update statement. '%s'", sqlite3_errmsg(database2)); 

      } 
      } 

作为第一个直接查询(使用sqlite3_exc)在这种情况下t他sqlite3_bind_text不工作后where子句。使用相同的查询,如果我尝试用于测试目的设置ZNAME的列ZTYPE(但其他任何列不能设置“Where”)它的工作原理。为什么?

这是的NSString oggetto的初始化,是选择查询的结果:

NSMutableString *oggetto; 
oggetto=[NSString stringWithCString:(char *)sqlite3_column_text(selectstmt, 0)]; 

此字符串保留正确的值(该值是“stringaoggetto”),我试图用NSLog的。

+0

oggetto有什么价值?您还应该绑定值而不是直接包含值。 – Anna 2011-05-17 16:34:10

+0

或者是因为您的oggetto与@“stringaoggetto”的值不同或者您的tableNames在两个查询中都不相同。 – SayeedHussain 2011-05-17 18:35:57

+0

对不起,tableName是我的一个错误,我编辑了这个问题。我已经发布了nsstring oggetto对象日志,你可以看到它打印了stringaoggetto。但是查询日志在两个示例中都输出相同的结果。 – Cri1682 2011-05-18 06:57:28

回答

0
  1. 改为此; [查询cStringUsingEncoding:NSUTF8StringEncoding]我认为这真的是你需要解决这个问题的关键。确保字符串被保留;这两个都应该有效。 NSLog(@“%s”,[query cStringUsingEncoding:NSUTF8StringEncoding]); NSLog(@“%s”,[query UTF8String]);

  2. 这也许有一些有用的提示; http://www.how2s.org/index.php/How_to_get_started_with_SQLite_on_the_iPhone 简化设计。

  3. 另外值得注意的是,你使用NULL,NULL,NULL。从sqlite3_exec语句中获取错误数据。 http://www.sqlite.org/c3ref/exec.html有参考资料让你开始。

  4. 您列出了多个问题。将其他问题分为其他问题。插入与“更新”不同。将此问题关注于更新。

  5. 如果这一切都没有帮助,NSString * oggetto如何设置,其中,相同的文件,差异文件,它是一个函数参数等?

+0

我试过[查询cStringUsingEncoding:NSUTF8StringEncoding];尽管如此,但结果是一样的。我也尝试了第二段代码(insertstm,它只是名称,它是一个更新查询,对不起,我已经编辑过这个问题),但没有成功。我插入了nsstring的init,是select查询的结果(select查询没有任何问题,它们完美地工作) – Cri1682 2011-05-18 08:50:01