在sqlite iphone sdk中更新值

时间:2012-07-10 01:39:58

标签: iphone sqlite sdk

我有一个简单的程序来更新表的记录

该表是“人”,有两列“名称”和“年龄”; 已插入一些记录,如下:

name age
tom 20
andy 30
han 25

现在我正在编写一个程序来更新表中的一行:

    NSString *database=[[NSBundle mainBundle] pathForResource:@"mytable" ofType:@"sqlite"];
    sqlite3_open([database UTF8String],&contactDB);
    NSString *text=@"andy";
    NSString *query=[NSString stringWithFormat:@"UPDATE person SET age=%d WHERE name='%@'",30,text];
    sqlite3_stmt *statement;
    sqlite3_prepare_v2(contactDB,[query UTF8String],-1,&statement,NULL);
    sqlite3_finalize(statement);
    sqlite3_close(contactDB);

该程序运行正常,但数据库未更新(我使用SQLite Manager浏览数据库)

当我尝试从数据库中读取时,它运作良好:

NSString *database=[[NSBundle mainBundle] pathForResource:@"mytable" ofType:@"sqlite"];
    sqlite3_open([database UTF8String],&contactDB);
    NSString *query1=[NSString stringWithFormat:@"SELECT * FROM person WHERE age=%d;",30];
    sqlite3_stmt *statement;
    sqlite3_prepare_v2(contactDB,[query1 UTF8String],-1,&statement,NULL);
    sqlite3_step(statement);    
    NSString *result=[[NSString alloc] initWithUTF8String:(const char *)sqlite3_column_text(statement, 0)];
    label.text=result;
    sqlite3_finalize(statement);
    sqlite3_close(contactDB);

5 个答案:

答案 0 :(得分:2)

 -(void)updateSetting:(NSArray *)arr
  {    
 if(sqlite3_open([databasePath UTF8String],&myDatabase)==SQLITE_OK)
  {
 sqlite3_stmt *compiledStmt;

  NSString *sqlStmt=[NSString stringWithFormat:@"UPDATE setting SET    flow='%@',formate='%@'  WHERE primaryKey=%i;",[arr objectAtIndex:0],[arr objectAtIndex:1],1];
  if(sqlite3_prepare_v2(myDatabase, [sqlStmt UTF8String],-1,&compiledStmt, NULL)==SQLITE_OK)    
  {
  NSLog(@"Successful update");
  }
sqlite3_step(compiledStmt);
sqlite3_close(myDatabase);  
  }

  }

答案 1 :(得分:1)

我已经遇到过这个问题。这背后的问题是你将查询作为字符串格式传递,因此你必须在查询语句的末尾使用;

NSString *query=[NSString stringWithFormat:@"UPDATE questionbank SET age=%d WHERE name='%@';",30,text];

答案 2 :(得分:1)

请在执行sqlite3_step方法之前进行如下检查。

const char      *sqlQuery           = "UPDATE SETTINGS SET someFlag = 0";
sqlite3_stmt    *insertStatement    = nil;
int              success            = 0;
if(sqlite3_prepare_v2(sqliteDatabase, sqlQuery, -1, &insertStatement, NULL) == SQLITE_OK)
{
    success = sqlite3_step(insertStatement);

    if(insertStatement)
    {
        sqlite3_finalize(insertStatement);
    }

    if(success == SQLITE_ERROR)
    {
        return NO;
    }
    return YES;
}
return NO;

这样你就可以找出问题所在。

答案 3 :(得分:0)

您需要检查是否可以访问和打开数据库。只需将更新细分放在if语句中,如下所示:if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)

在准备好后,请尝试添加NSLog(@"%s", sqlite3_errmsg(database));以查看是否有任何错误。

答案 4 :(得分:0)

这个问题的答案是主包中的数据库是只读的

I can not insert data into sqlite3 file on XCode