我有一个简单的程序来更新表的记录
该表是“人”,有两列“名称”和“年龄”; 已插入一些记录,如下:
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);
答案 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)
这个问题的答案是主包中的数据库是只读的